【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',只需向上跳一个 ...
随机推荐
- react 使用antd导航组件实现事件传递并局部刷新DOM
我们要实现一个通过点击顶部导航来查询左侧菜单的一个功能 在这个功能中,我们要应用到onClick={this.headNavMenuList.bind(this)}方法来传递点击 不同按钮来传递不同的 ...
- slam学习足迹
1.slam入门介绍 2.齐次坐标系 3.贝叶斯滤波 均值:平均值 标准差:样本的集中程度/分散度 方差:标准差的平方 协方差:不同维度之间的关系(相关度) 协方差矩阵:多维度之间的关系(相关度) 4 ...
- 网站防火墙探测工具Wafw00f
网站防火墙探测工具Wafw00f 现在网站为了加强自身安全,通常都会安装各类防火墙.这些防火墙往往会拦截各种扫描请求,使得测试人员无法正确判断网站相关信息.Kali Linux提供了一款网站防火墙探 ...
- luogu P3147 [USACO16OPEN]262144
题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small to ...
- 苹果iOS APP配置HTTPS,iOS ATS配置SSL,苹果ATS标准解决方案
参考沃通:
- Flutter开发记录part3
(1) 获取当前屏幕宽度 width: MediaQuery.of(context).size.width, (1) pull_to_refresh,smartrefresh 自定义文字: new S ...
- 常用jar包之commons-digester使用
常用jar包之commons-digester使用 学习了:https://blog.csdn.net/terryzero/article/details/4332257 注意了, digester. ...
- 96Boards扩展板 STM32 B96B-F446VE 牛刀小试
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...
- [转载]使用RoboCopy 命令
经常进行文件管理操作的朋友们,不满意于Windows系统内置的复制功能,因为它太龟速了.于是大家就使用FastCopy.TeraCopy之类的软件来加速复制,但是你是否知道Windows 7已经内置快 ...
- intent传值传对象跳转
intent传值传对象跳转 1.传值 //原activity中存入一个字段 intent = new Intent(From.this, To.class); intent.putExtra(&quo ...