树剖+树状数组套线段树O(nlogn^3)(我打的),有一种更加优秀的算法是O(nlogn^2)的就是直接树状数组套线段树欧拉序(并不快),或者是用主席树维护原始的树的信息,同时用树状数组套线段树维护dfs序上的修改(很优秀),这道题将树上信息转化为序列信息,并在此基础之上用任意树套树,只不过转化的方式不一样,要么是树剖,要么是树上差分(dfs序或者欧拉序都可以)

#include <cstdio>
#include <cstring>
#include <algorithm>
#define mid ((l+r)>>1)
#define newnode (node+(sz++))
const int N=;
const int Inf=;
char xB[(<<)+],*xS=xB,*xTT=xB;
#define gtc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++)
inline void read(int &sum){
register char ch=gtc();
for(sum=;ch<''||ch>'';ch=gtc());
for(;ch>=''&&ch<='';sum=(sum<<)+(sum<<)+ch-'',ch=gtc());
}
struct Segment_Tree{
Segment_Tree *ch[];
int size;
}node[N*],*add[N],*red[N],*null,*root[N];
int cnt1,cnt2;
int n,cnt;
int val[N];
struct V{
int to,next;
}c[N<<];
int head[N],t,sz;
int ote[N],weight[N],deep[N],size[N];
int Ti,top[N],dfn[N],id[N];
inline void Init(){
null=newnode;
null->ch[]=null->ch[]=null;
null->size=;
for(int i=;i<=n;++i)root[i]=null;
}
inline void U1(Segment_Tree *&p,int l,int r,int pos){
--p->size;
if(l==r)return;
if(pos<=mid)U1(p->ch[],l,mid,pos);
else U1(p->ch[],mid+,r,pos);
}
inline void U2(Segment_Tree *&p,int l,int r,int pos){
if(p==null)p=newnode,p->ch[]=p->ch[]=null,p->size=;
++p->size;
if(l==r)return;
if(pos<=mid)U2(p->ch[],l,mid,pos);
else U2(p->ch[],mid+,r,pos);
}
inline int Q(int l,int r,int k){
if(l==r)return l;
register int sum=,i;
for(i=;i<=cnt1;++i)
sum+=add[i]->ch[]->size;
for(i=;i<=cnt2;++i)
sum-=red[i]->ch[]->size;
if(sum>=k){
for(i=;i<=cnt1;++i)
add[i]=add[i]->ch[];
for(i=;i<=cnt2;++i)
red[i]=red[i]->ch[];
return Q(mid+,r,k);
}else{
for(i=;i<=cnt1;++i)
add[i]=add[i]->ch[];
for(i=;i<=cnt2;++i)
red[i]=red[i]->ch[];
return Q(l,mid,k-sum);
}
}
inline void Q1(int pos){
for(;pos>;pos-=pos&(-pos))
add[++cnt1]=root[pos],cnt+=root[pos]->size;
}
inline void Q2(int pos){
for(;pos>;pos-=pos&(-pos))
red[++cnt2]=root[pos],cnt-=root[pos]->size;
}
inline void U(int pos,int val0,int val){
for(;pos<=n;pos+=pos&(-pos))
U1(root[pos],,Inf,val0),U2(root[pos],,Inf,val);
}
inline void U(int pos,int val){
for(;pos<=n;pos+=pos&(-pos))
U2(root[pos],,Inf,val);
}
inline void addedge(int x,int y){
c[++t].to=y,c[t].next=head[x],head[x]=t;
}
inline void dfs1(int x,int OPai){
ote[x]=OPai,deep[x]=deep[OPai]+;
size[x]=;
for(int i=head[x];i;i=c[i].next)
if(c[i].to!=OPai){
dfs1(c[i].to,x);
size[x]+=size[c[i].to];
if(size[c[i].to]>size[weight[x]])
weight[x]=c[i].to;
}
}
inline void dfs2(int x,int tp){
dfn[x]=++Ti,id[Ti]=x,top[x]=tp;
if(weight[x]==)return;
dfs2(weight[x],tp);
for(int i=head[x];i;i=c[i].next)
if(c[i].to!=ote[x]&&c[i].to!=weight[x])
dfs2(c[i].to,c[i].to);
}
inline void Q(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])std::swap(x,y);
Q1(dfn[x]),Q2(dfn[top[x]]-);
x=ote[top[x]];
}
if(deep[x]<deep[y])std::swap(x,y);
Q1(dfn[x]),Q2(dfn[y]-);
}
int main(){
int T;
read(n),read(T),Init();
for(int i=;i<=n;++i)read(val[i]);
for(int i=,x,y;i<n;++i){
read(x),read(y);
addedge(x,y),addedge(y,x);
}
dfs1(,),dfs2(,);
for(int i=;i<=n;++i)
U(dfn[i],val[i]);
int k,a,b;
while(T--){
read(k),read(a),read(b);
if(k==){
U(dfn[a],val[a],b),val[a]=b;
continue;
}
cnt1=cnt2=;
cnt=,Q(a,b);
if(cnt<k){
puts("invalid request!");
continue;
}
printf("%d\n",Q(,Inf,k));
}return ;
}

【BZOJ 1146】[CTSC2008]网络管理Network的更多相关文章

  1. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

  2. BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 870  Solved: 299[Submit] ...

  3. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  4. bzoj 1146 [CTSC2008]网络管理Network

    很久之前写过 count on the tree. 然后一直不懂树状数组是怎么套上这个主席树的. 看了两小时发现它套的就是个权值线段树, 看不出来可持久化在哪里. 因为动态开点所以空间nlog2n. ...

  5. BZOJ 1146: [CTSC2008]网络管理Network 带修改主席树_树套树_DFS序

    Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路 ...

  6. [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  7. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  8. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  9. [BZOJ1146][CTSC2008]网络管理Network

    [BZOJ1146][CTSC2008]网络管理Network 试题描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建 ...

  10. Luogu4175:[CTSC2008]网络管理Network

    题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...

随机推荐

  1. js实现监听浏览器窗口大小改变事件

    window.onresize = function(){   }

  2. STM32进阶之串口环形缓冲区实现(转载)

    转载自微信公众号“玩转单片机”,感谢原作者“杰杰”. 队列的概念 在此之前,我们来回顾一下队列的基本概念:队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO) ...

  3. rhel6.4扩充swap分区

    状况:Red hat 6.4 swap分区不足 解决:扩充swap ================================================================== ...

  4. Codeforces 845 C Two TVs

    参考:https://blog.csdn.net/xjh_shin/article/details/77491693 #include <iostream> #include <cs ...

  5. win7 下安装oracle 11g出现错误: 启动服务出现错误 找不到服务OracleMTSRecoveryService

    这种错误是在多次安装oracle都没有成功的情况下发生的. 正确安装oracle,是有前提条件的 1,安装最新的jdk,不是jre!!(并配好环境变量,在cmd中测试 java -version与ja ...

  6. 20145202马超《JAVA》预备作业3

    虚拟机的安装[http://www.cnblogs.com/tuolemi/p/5861062.html] Linux命令[http://www.cnblogs.com/tuolemi/p/58781 ...

  7. android staido 断点遇到的坑

    今天排查数据布点问题,发现sd卡上面的文件莫名消失. 怎么可能?系统不可能删除你的文件,但是我调试,删除文件的代码, 一直都没有执行啊. 后来发现,子线程里面代码,android stadio 可能断 ...

  8. windows下oracle 11g r2 安装过程与卸载详细图解

    Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点‘是' 3.下图后,选择创建和配置数 ...

  9. Linux 服务器 监控命令

    1 top top类似于windows下面的资源管理器.不仅能够从服务器整体上展示服务器的大致情况,还可以看到具体进程 耗费资源的情况. 展示内存.cpu.交换分区等信息 如上图: 第一行主要描述系统 ...

  10. 30分钟 带你浅入seajs源码

    上个星期写了浅入requirejs的,  大家都知道 require是AMD规范(Asynchronous Module Definition) 来  今天我们一起看看 CMD规范(Common Mo ...