BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
题目描述
输入
输出
样例输入
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
样例输出
2
2
invalid request!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int s[80050];
int t[80050];
int num;
int cnt;
int tot;
int a[80050];
int head[80050];
int to[160050];
int next[160050];
int sum[20000050];
int ls[20000050];
int rs[20000050];
int root[160050];
int f[80050];
int size[80010];
int top[80010];
int son[80010];
int d[80050];
int s1[80050];
int s2[80050];
int s3[80050];
int s4[80050];
int opt;
int x,y;
void addd(int x,int y)
{
tot++;
next[tot]=head[x];
head[x]=tot;
to[tot]=y;
}
void dfs2(int x,int t)
{
top[x]=t;
if(son[x])
{
dfs2(son[x],t);
}
for(int i=head[x];i;i=next[i])
{
if(to[i]!=f[x]&&to[i]!=son[x])
{
dfs2(to[i],to[i]);
}
}
}
int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(d[top[x]]>d[top[y]])
{
swap(x,y);
}
y=f[top[y]];
}
return d[x]<d[y]?x:y;
}
void updata(int &rt,int l,int r,int k,int v)
{
if(!rt)
{
rt=++cnt;
}
sum[rt]+=v;
if(l==r)
{
return ;
}
int mid=(l+r)>>1;
if(k<=mid)
{
updata(ls[rt],l,mid,k,v);
}
else
{
updata(rs[rt],mid+1,r,k,v);
}
}
int query(int l,int r,int k)
{
if(l==r)
{
return l;
}
int res=0;
for(int i=1;i<=s1[0];i++)
{
res+=sum[ls[s1[i]]];
}
for(int i=1;i<=s2[0];i++)
{
res+=sum[ls[s2[i]]];
}
for(int i=1;i<=s3[0];i++)
{
res-=sum[ls[s3[i]]];
}
for(int i=1;i<=s4[0];i++)
{
res-=sum[ls[s4[i]]];
}
int mid=(l+r)>>1;
if(k<=res)
{
for(int i=1;i<=s1[0];i++)
{
s1[i]=ls[s1[i]];
}
for(int i=1;i<=s2[0];i++)
{
s2[i]=ls[s2[i]];
}
for(int i=1;i<=s3[0];i++)
{
s3[i]=ls[s3[i]];
}
for(int i=1;i<=s4[0];i++)
{
s4[i]=ls[s4[i]];
}
return query(l,mid,k);
}
else
{
for(int i=1;i<=s1[0];i++)
{
s1[i]=rs[s1[i]];
}
for(int i=1;i<=s2[0];i++)
{
s2[i]=rs[s2[i]];
}
for(int i=1;i<=s3[0];i++)
{
s3[i]=rs[s3[i]];
}
for(int i=1;i<=s4[0];i++)
{
s4[i]=rs[s4[i]];
}
return query(mid+1,r,k-res);
}
}
void add(int k,int x,int v)
{
for(int i=x;i<=n;i+=i&(-i))
{
updata(root[i],0,100000000,k,v);
}
}
void ask(int x,int y,int k)
{
s1[0]=0;
s2[0]=0;
s3[0]=0;
s4[0]=0;
int anc=lca(x,y);
for(int i=s[x];i;i-=i&(-i))
{
s1[++s1[0]]=root[i];
}
for(int i=s[y];i;i-=i&(-i))
{
s2[++s2[0]]=root[i];
}
for(int i=s[anc];i;i-=i&(-i))
{
s3[++s3[0]]=root[i];
}
if(f[anc])
{
for(int i=s[f[anc]];i;i-=i&(-i))
{
s4[++s4[0]]=root[i];
}
}
int len=d[x]+d[y]-d[anc]-d[f[anc]];
if(len<k)
{
printf("invalid request!\n");
}
else
{
printf("%d\n",query(0,100000000,len-k+1));
}
}
void dfs(int x,int fa)
{
d[x]=d[fa]+1;
f[x]=fa;
size[x]=1;
s[x]=++num;
add(a[x],s[x],1);
for(int i=head[x];i;i=next[i])
{
if(to[i]!=fa)
{
dfs(to[i],x);
size[x]+=size[to[i]];
if(size[to[i]]>size[son[x]])
{
son[x]=to[i];
}
}
}
t[x]=num+1;
add(a[x],t[x],-1);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
addd(x,y);
addd(y,x);
}
dfs(1,0);
dfs2(1,1);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&opt,&x,&y);
if(!opt)
{
add(a[x],s[x],-1);
add(a[x],t[x],1);
a[x]=y;
add(a[x],s[x],1);
add(a[x],t[x],-1);
}
else
{
ask(x,y,opt);
}
}
}
BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树的更多相关文章
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
- BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- 【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)
题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作: 1:将X号点的点权修改为Y 2:查询X到Y的路径上第K大的点权 n,q<=80000 a[i]<=10^8 思路: ...
- Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+ 树状数组或线段树
C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...
- CoderForces 163E e-Government(AC自动机+树状数组维护fail树的dfs序)
E. e-Government time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)
题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...
- [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- POJ 2763 Housewife Wind(DFS序+LCA+树状数组)
Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 11419 Accepted: 3140 D ...
随机推荐
- node 文件操作
对文件的各种操作,使用姿势如下 文件操作单例 @example fu.exist(file); //是否存在 fu.copy(file, 'new-path'); //复制到某个新目录 fu.move ...
- linux 服务器安全加固和内核参数调优 nf_conntrack
0.内部设置跳板机,服务器只能通过跳板机登录1.禁止ROOT用户远程登录和登录端口 禁止ROOT用户远程登录 .打开 /etc/ssh/sshd_config PermitRootLogin no . ...
- Python文学家为Python写的一首词?(附中英文版)
The Zen of Python, by Tim Peters (Python之禅 by Tim Peters) Beautiful is better than ugly. (优美胜于丑陋(Pyt ...
- npm install报错 npm ERR! enoent ENOENT: no such file or directory
在npm之后出现如下错误: $ npm install npm WARN checkPermissions Missing write access to /Users/lucas/code/js/v ...
- [Spark][Python]groupByKey例子
Spark Python 索引页 [Spark][Python]sortByKey 例子 的继续: [Spark][Python]groupByKey例子 In [29]: mydata003.col ...
- [Oracle]Oracle Fail Safe 与 SQLNET.AUTHENTICATION_SERVICES关系
现象: 在使用 OFS (Oracle Fail Safe)的环境中,把数据库的 SQLNET.AUTHENTICATION_SERVICES 从 NTS 改为 NONE之后,当从 Oracle Fa ...
- Asp.Net MVC 获取当前 Controller Action Area
获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); 获取Action名称: ViewContext.Ro ...
- 任务(task)
任务概述 线程(Thread)是创建并发的底层工具,因此有一定的局限性(不易得到返回值(必须通过创建共享域):异常的捕获和处理也麻烦:同时线程执行完毕后无法再次开启该线程),这些局限性会降低性能同时影 ...
- Jmeter(三十二)_搭建本地接口自动化环境
我们在学习接口自动化的时候,最理想的状态是在公司有项目可以操作.大部分时候我们并没有可以练习的项目,因此练习接口无从谈起,只能找一些开放的api来练一练,但是这样并不能提高我们的技术.因此我们需要搭建 ...
- 我的devops实践经验分享一二
前言 随着系统越来越大,开发人员.站点.服务器越来越多,微服务化推进,......等等原因,实现自动化的devops越来越有必要. 当然,真实的原因是,在团队组建之初就预见到了这些问题,所以从一开始就 ...