树剖+树状数组套线段树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. sftp上传到远程服务器

    开发遇到一个需求,需要将图片通过sftp上传到远程服务器上,之前没用过这个功能,折腾了我好几天才搞定,下面记录下我的处理方法: $sftp = 'ssh2.sftp://';//连接sftp $con ...

  2. Hadoop Eclipse 插件制作以及安装

    在本地使用Eclipse调试MapReduce程序,需要Hadoop插件,笔摘记录下制作安装过程. 准备工作(hadoop-2.6.0为例): 搭建好Hadoop环境 下载Hadoop安装包,解压到某 ...

  3. 怎么用Python Flask模板jinja2在网页上打印显示16进制数?

    问题:Python列表(或者字典等)数据本身是10进制,现在需要以16进制输出显示在网页上 解决: Python Flask框架中 模板jinja2的If 表达式和过滤器 假设我有一个字典index, ...

  4. Go web表单验证

    开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要 必填字段 if len(r.Form["username"][0])==0{ // ...

  5. Spyder在windows下常用快捷键

    块注释/反块注释:Ctrl+4/5 行注释/反行注释:Ctrl+1 代码提示:Tab 复制一行:Ctrl+Alt+↓/↑ 删除一行:Ctrl+D 运行:F5 全屏:F11 撤销:Ctrl+Z 反撤销: ...

  6. 在linux使用锐捷客户端上网(华中科技大学)

    第一步:下载锐捷客户端linux版本,下载网址为http://ncc.hust.edu.cn/cyxz/rzkhd.htm 第二步:解压该包,进入目录 #unzip RG_Supplicant_For ...

  7. 【转】谈谈 iOS 中图片的解压缩

    转自:http://blog.leichunfeng.com/blog/2017/02/20/talking-about-the-decompression-of-the-image-in-ios/ ...

  8. Git 查看远程分支、本地分支、删除本地分支及远程分支

    1. 删除本地分支: git branch -d branchName 2. 删除远程分支: // 方法一:将删除的本地分支推到远程(要删除的远程分支在本地有映射) git push origin : ...

  9. 4299: Codechef FRBSUM

    4299: Codechef FRBSUM https://www.lydsy.com/JudgeOnline/problem.php?id=4299 分析: 主席树. https://blog.se ...

  10. Java检测端口的占用情况

    突然间想到这个问题,在网上搜了一下 http://blog.csdn.net/danieluk/article/details/18518175 网上有很多文章都是用上面那个方法来解决这个问题的,总感 ...