BZOJ_1146_[CTSC2008]网络管理Network_主席树+树状数组
BZOJ_1146_[CTSC2008]网络管理Network_主席树
Description
Input
Output
Sample Input
5 1 2 3 4
3 1
2 1
4 3
5 3
2 4 5
0 1 2
2 2 3
2 1 4
3 3 5
Sample Output
2
2
invalid request!
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 80050
#define maxn 100000000
int n,m,head[N],to[N<<1],nxt[N<<1],val[N],dfn[N],cnt,out[N];
int fa[N],top[N],son[N],size[N],dep[N],tot,A[N],B[N],C[N],D[N];
int siz[N*250],ls[N*250],rs[N*250],root[N];
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
void insert(int &y,int l,int r,int v,int c) {
if(!y) y=++tot; siz[y]+=c;
if(l==r) return ;
int mid=(l+r)>>1;
if(v<=mid) insert(ls[y],l,mid,v,c);
else insert(rs[y],mid+1,r,v,c);
}
void dfs1(int x,int y) {
int i; dep[x]=dep[y]+1; fa[x]=y; size[x]=1; dfn[x]=++dfn[0];
for(i=dfn[x];i<=n;i+=i&(-i)) insert(root[i],0,maxn,val[x],1);
for(i=head[x];i;i=nxt[i]) if(to[i]!=y) {
dfs1(to[i],x); size[x]+=size[to[i]]; if(size[to[i]]>size[son[x]]) son[x]=to[i];
}
for(i=dfn[0]+1;i<=n;i+=i&(-i)) insert(root[i],0,maxn,val[x],-1);
out[x]=dfn[0]+1;
}
void dfs2(int x,int t) {
top[x]=t; if(son[x]) dfs2(son[x],t); int i;
for(i=head[x];i;i=nxt[i]) if(to[i]!=fa[x]&&to[i]!=son[x]) dfs2(to[i],to[i]);
}
int lca(int x,int y) {
while(top[x]!=top[y]) {
if(dep[top[x]]>dep[top[y]]) swap(x,y);
y=fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
int query(int l,int r,int k) {
if(l==r) return l;
int mid=(l+r)>>1,i,sizls=0;
for(i=1;i<=A[0];i++) sizls+=siz[ls[A[i]]];
for(i=1;i<=B[0];i++) sizls+=siz[ls[B[i]]];
for(i=1;i<=C[0];i++) sizls-=siz[ls[C[i]]];
for(i=1;i<=D[0];i++) sizls-=siz[ls[D[i]]];
if(k<=sizls) {
for(i=1;i<=A[0];i++) A[i]=ls[A[i]];
for(i=1;i<=B[0];i++) B[i]=ls[B[i]];
for(i=1;i<=C[0];i++) C[i]=ls[C[i]];
for(i=1;i<=D[0];i++) D[i]=ls[D[i]];
return query(l,mid,k);
}else {
for(i=1;i<=A[0];i++) A[i]=rs[A[i]];
for(i=1;i<=B[0];i++) B[i]=rs[B[i]];
for(i=1;i<=C[0];i++) C[i]=rs[C[i]];
for(i=1;i<=D[0];i++) D[i]=rs[D[i]];
return query(mid+1,r,k-sizls);
}
}
int main() {
scanf("%d%d",&n,&m);
int i,x,y,k;
for(i=1;i<=n;i++) scanf("%d",&val[i]);
for(i=1;i<n;i++) {
scanf("%d%d",&x,&y); add(x,y); add(y,x);
}
dfs1(1,0); dfs2(1,1);
while(m--) {
scanf("%d%d%d",&k,&x,&y);
if(!k) {
for(i=dfn[x];i<=n;i+=i&(-i)) insert(root[i],0,maxn,val[x],-1);
for(i=out[x];i<=n;i+=i&(-i)) insert(root[i],0,maxn,val[x],1);
val[x]=y;
for(i=dfn[x];i<=n;i+=i&(-i)) insert(root[i],0,maxn,val[x],1);
for(i=out[x];i<=n;i+=i&(-i)) insert(root[i],0,maxn,val[x],-1);
}else {
A[0]=B[0]=C[0]=D[0]=0;
int l=lca(x,y),len=dep[x]+dep[y]-dep[l]-dep[fa[l]];
if(len<k) puts("invalid request!");
else {
k=len-k+1;
for(i=dfn[x];i;i-=i&(-i)) A[++A[0]]=root[i];
for(i=dfn[y];i;i-=i&(-i)) B[++B[0]]=root[i];
for(i=dfn[l];i;i-=i&(-i)) C[++C[0]]=root[i];
if(fa[l]) for(i=dfn[fa[l]];i;i-=i&(-i)) D[++D[0]]=root[i];
printf("%d\n",query(0,maxn,k));
}
}
}
}
/*
5 5
5 1 2 3 4
3 1
2 1
4 3
5 3
2 4 5
0 1 2
2 2 3
2 1 4
3 3 5
*/
BZOJ_1146_[CTSC2008]网络管理Network_主席树+树状数组的更多相关文章
- [CTSC2008]网络管理(整体二分+树剖+树状数组)
一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) ...
- CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)
The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...
- 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树
[BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...
- BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
随机推荐
- XML学习教程
XML学习进阶1-- 什么是XML. 为什么使用 XML?... 什么是 XML?... 数据的结构表示... XML 文档... 数据是从表示和处理中分离出来的... 使XML数据自描述... XM ...
- Jersey VS Django-Rest
在对Restful服务框架做对比前,主要先说说Restful设计的三大主要元素:以资源为核心的资源方法.资源状态.关系链接超媒体表述. 辅助的有内容协商.安全.版本化设计等. Jersey作为Java ...
- es6(五):class关键字(extends,super,static)
ES5中,生成对象通过构造函数: function A(name,age){ this.name=name; this.age=age } // 在A的prototype属性上定义一个test方法,即 ...
- JavaScript要点汇总——The Most Important
关于JavaScript的基础变量,运算符的详解以及基本的分支循环嵌套已经在 JS基础变量及JS中的运算符 JS中的循环分支嵌套 说过了,今天我们所说的是做网页中最长用到的东西.内容不算少,要有耐心, ...
- Windows下配置vue的环境
最近在学习vue.js,希望前端能用vue来作为主要框架.这里记录一下NPM在Windows中安装过程. 下载安装 下载地址 下载v6.11.0 LTS稳定版. 在C盘创建nodejs目录,并进行安装 ...
- memcached安装、使用
Memcached客户端01:XMemcached 版本选择:2.0.0 XMemcached:https://github.com/killme2008/xmemcached XMemcac ...
- MySQL下载安装配置和Navicat for MySQL的安装配置
MySQL 一.下载 地址:MySQL :: Download MySQL Installer 选择那个几百M的msi文件下载 二.安装 第一步: 安装许可 双击安装文件,在如下图所示界面中勾选&qu ...
- PAT1134:Vertex Cover
1134. Vertex Cover (25) 时间限制 600 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A vertex ...
- 谈论seo思维性对优化中起到决定性的作用
在<SEO的艺术>又出版之后,SEO艺术更加受到了广大SEOer的关注和热捧,在这本书里面,也有很多的不为人知的技巧分享.SEO的艺术强调的是SEO融入网络营销,融入社会化媒体大潮,然而这 ...
- springboot+mybatis+redis实现分布式缓存
大家都知道springboot项目都是微服务部署,A服务和B服务分开部署,那么它们如何更新或者获取共有模块的缓存数据,或者给A服务做分布式集群负载,如何确保A服务的所有集群都能同步公共模块的缓存数据, ...