【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树
【BZOJ1146】[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!
题解:用树状数组+主席树维护DFS序即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=80010;
int n,m,N,nm,cnt,tot,l1,l2,l3,l4;
int p[maxn],q[maxn],s1[maxn],s2[maxn],s3[maxn],s4[maxn],v[maxn],pa[maxn],pb[maxn],pc[maxn];
int to[maxn<<1],next[maxn<<1],head[maxn],fa[18][maxn],dep[maxn],rt[maxn],ref[maxn<<1];
struct number
{
int val,org;
}num[maxn<<1];
struct node
{
int siz,ls,rs;
}s[maxn*160];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp(number a,number b)
{
return a.val<b.val;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
p[x]=++q[0];
for(int i=head[x];i!=-1;i=next[i])
{
if(to[i]==fa[0][x]) continue;
fa[0][to[i]]=x,dep[to[i]]=dep[x]+1,dfs(to[i]);
}
q[x]=q[0];
}
void insert(int &x,int l,int r,int pos,int v)
{
if(!x) x=++tot;
s[x].siz+=v;
if(l==r) return ;
int mid=l+r>>1;
if(pos<=mid) insert(s[x].ls,l,mid,pos,v);
else insert(s[x].rs,mid+1,r,pos,v);
}
void updata(int x,int y,int v)
{
for(int i=x;i<=n;i+=i&-i) insert(rt[i],1,N,y,v);
}
int query(int l,int r,int pos)
{
if(!pos) printf("fuck\n");
if(l==r) return ref[l];
int sr=0,mid=l+r>>1,i;
for(i=1;i<=l1;i++) sr+=s[s[s1[i]].rs].siz;
for(i=1;i<=l2;i++) sr+=s[s[s2[i]].rs].siz;
for(i=1;i<=l3;i++) sr-=s[s[s3[i]].rs].siz;
for(i=1;i<=l4;i++) sr-=s[s[s4[i]].rs].siz;
if(pos<=sr)
{
for(i=1;i<=l1;i++) s1[i]=s[s1[i]].rs;
for(i=1;i<=l2;i++) s2[i]=s[s2[i]].rs;
for(i=1;i<=l3;i++) s3[i]=s[s3[i]].rs;
for(i=1;i<=l4;i++) s4[i]=s[s4[i]].rs;
return query(mid+1,r,pos);
}
else
{
for(i=1;i<=l1;i++) s1[i]=s[s1[i]].ls;
for(i=1;i<=l2;i++) s2[i]=s[s2[i]].ls;
for(i=1;i<=l3;i++) s3[i]=s[s3[i]].ls;
for(i=1;i<=l4;i++) s4[i]=s[s4[i]].ls;
return query(l,mid,pos-sr);
}
}
int lca(int a,int b)
{
if(dep[a]<dep[b]) swap(a,b);
int i;
for(i=17;~i;i--) if(dep[fa[i][a]]>=dep[b]) a=fa[i][a];
if(a==b) return a;
for(i=17;~i;i--) if(fa[i][a]!=fa[i][b]) a=fa[i][a],b=fa[i][b];
return fa[0][a];
}
int main()
{
n=rd(),m=rd();
int i,j,a,b,c,d,e;
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++) num[++nm].val=rd(),num[nm].org=i;
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
dep[1]=1,dfs(1);
for(j=1;(1<<j)<=n;j++) for(i=1;i<=n;i++) fa[j][i]=fa[j-1][fa[j-1][i]];
for(i=1;i<=m;i++)
{
pc[i]=rd(),pa[i]=rd(),pb[i]=rd();
if(!pc[i]) num[++nm].val=pb[i],num[nm].org=n+i;
}
sort(num+1,num+nm+1,cmp);
for(i=1;i<=nm;i++)
{
if(num[i].val>ref[N]) ref[++N]=num[i].val;
if(num[i].org<=n) v[num[i].org]=N;
else pb[num[i].org-n]=N;
}
for(i=1;i<=n;i++) updata(p[i],v[i],1),updata(q[i]+1,v[i],-1);
for(i=1;i<=m;i++)
{
c=pc[i],a=pa[i],b=pb[i];
if(!c)
{
updata(p[a],v[a],-1),updata(q[a]+1,v[a],1),v[a]=b,updata(p[a],b,1),updata(q[a]+1,b,-1);
}
else
{
d=lca(a,b),e=fa[0][d],l1=l2=l3=l4=0;
if(dep[a]+dep[b]-dep[d]-dep[e]<c)
{
printf("invalid request!\n");
continue;
}
for(j=p[a];j;j-=j&-j) s1[++l1]=rt[j];
for(j=p[b];j;j-=j&-j) s2[++l2]=rt[j];
for(j=p[d];j;j-=j&-j) s3[++l3]=rt[j];
for(j=p[e];j;j-=j&-j) s4[++l4]=rt[j];
printf("%d\n",query(1,N,c));
}
}
return 0;
}//5 5 5 1 2 3 4 3 1 2 1 4 3 5 3 1 1 1 1 1 5 2 1 5 3 1 5 2 1 2
【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树的更多相关文章
- 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
[题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
- 【BZOJ-1103】大都市meg 树状数组 + DFS序
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2009 Solved: 1056[Submit][Sta ...
- POJ 3321 Apple Tree (树状数组+dfs序)
题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...
- BZOJ 1103 [POI2007]大都市meg(树状数组+dfs序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1103 [题目大意] 给出一棵树,每条边的经过代价为1,现在告诉你有些路不需要代价了, ...
- [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]
题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...
- HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)
Tree chain problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- BZOJ.2434.[NOI2011]阿狸的打字机(AC自动机 树状数组 DFS序)
题目链接 首先不需要存储每个字符串,可以将所有输入的字符依次存进Trie树,对于每个'P',记录该串结束的位置在哪,以及当前节点对应的是第几个串(当前串即根节点到当前节点):对于'B',只需向上跳一个 ...
随机推荐
- HDU 6225.Little Boxes-大数加法 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))
整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/O ...
- Hibernate search与Lucene包异常学习心得
最近使用了了一下Hibernate Search这个组件 这个组件是对域模型进行全文检索,在全文检索的底层实现上使用了Lucene技术 在进行小测试的时候费了很大的力气去搞定包的问题 我直接通过实例 ...
- NULL的学问
在数据库中存在一种特殊的值:NULL(空值).一个字段如果没有被赋值,那么它的值就是NULL,NULL并不代表没有值而是表示值未知.员工信息表中存储着身份证号.姓名.年龄等信息,其中某条记录中年龄字段 ...
- j2ee性能调优之最小化资源压力测试法则
前面看到有人讲j2ee的性能调优,虽然这块不是自己的专长,但是猪养多了,也忍不住跳出来说几句. 虽然几乎每本讲性能调优的书籍开篇都会提,没必要的情况下就不要做调优,但是我个人还是认为,所有系统在上线前 ...
- Jenkins里邮件插件触发器配置和Send to Developers到底是什么意思(转)
邮件触发类型介绍(Triggers) By default, the onlytrigger configured is the "Failure" trigger. To ad ...
- require_once(): Failed opening required '/var/www/config/config.php' (include_path='.:') in /var/www/vendor/forkiss/pharest/src/Pharest/Register/Register.php on line 10
环境 docker环境 错误 [Tue Jun 18 18:43:26 2019] 127.0.0.1:53980 [500]: /index.php - require_once(): Failed ...
- ArcObject开发,“异常在 ESRI.ArcGIS.Version.dll”错误
“System.DllNotFoundException”类型的未经处理的异常在 ESRI.ArcGIS.Version.dll 中发生 其他信息: 无法加载 DLL“ArcGISVersion.dl ...
- ubuntu git 下添加 ssh
1 ssh-keygen 产生公钥和私钥 2 cat ~/.ssh/id_rsa.pub 复制出对应的公钥, 3 拷贝到git上的ssh-key里,注意拷贝时,换行处可能会引起错误,要把换行处的空格 ...
- DbVisualizer9.0.6破解版下载、破解方法以及补丁
DbVisualizer破解方法如下:第一步:把下载的dbvis.puk文件,替换掉安装目录“D:\Program Files\DbVisualizer-6.0.12\lib”下dbvis.jar里面 ...
- *** Python版一键安装脚本
本脚本适用环境:系统支持:CentOS 6,7,Debian,Ubuntu内存要求:≥128M日期:2018 年 02 月 07 日 关于本脚本:一键安装 Python 版 *** 的最新版.友情提示 ...