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 ...
随机推荐
- JDBC使用MYSQL的LOAD DATA LOACAL INFILE和LOAD DATA INFILE
MYSQL的LOAD方法都必须建立在mysql服务允许使用该命令的情况下: 开启该命令的方法: 1.在实例对应的my.cnf(windows为my.ini)中添加一行local-infile=1(默认 ...
- 使用自定义端口连接SQL Server的方法(转载)
使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例,这样使用TCP/IP远程连接时就产生了问题.如何在Mi ...
- C#实现一张塔松叶
前段时间,Insus.NET有实现一组字符串在输出时,靠左或靠右对齐.<输出的字符靠右对齐>http://www.cnblogs.com/insus/p/7953304.html 现在In ...
- Flask源码解读--所有可扩展点
一.前言 flask中有很多可扩展点(笔者这样称呼),其中包含了信号和请求钩子,这些信号和钩子有什么用呢?其主要作用用于帮助我们进行程序的耦合性,当然还可以让我们自定义一些行为.话不多说,通过阅读源码 ...
- java线程池和中断总结
目录 java线程池和中断总结 一. 线程池的使用 二. java中断机制 中断的处理 三. 线程间通信机制总结 java线程池和中断总结 本系列文是对自己学习多线程和平时使用过程中的知识梳理,不适合 ...
- vue-router 注意事项
1.vue-router 两种模式 (1)mode:hash,hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件.vue默认为hash模式 window.onh ...
- Centos下安装破解Jira7的操作记录
Jira是一个集项目计划.任务分配.需求管理.错误跟踪于一体的工具,可以作为一个bug管理系统,可以将在测试过程中所发现的bug录入.分配给开发人员.前面介绍了Confluence在Centos下的安 ...
- php安全配置记录和常见错误梳理
通常部署完php环境后会进行一些安全设置,除了熟悉各种php漏洞外,还可以通过配置php.ini来加固PHP的运行环境,PHP官方也曾经多次修改php.ini的默认设置.下面对php.ini中一些安全 ...
- 个人阅读作业2—《No Silver Bullet: Essence and Accidents of Software Engineering》读后感
在进行了一次结对编程.一次团队编程和一次个人编程项目后,读了<No Silver Bullet: Essence and Accidents of Software Engineering> ...
- Linux基础实践
Linux基础实践 1.1 应用安装 要求:掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法 备份原地址列表文件:sudo cp /etc/apt/sou ...