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 ...
随机推荐
- Omi框架学习之旅 - 组件 及原理说明
hello world demo看完后其实基本的写法就会了. 但是omi中的组件是神马鬼?其实我也不知道组件是啥. 百度百科是这么说的: 是对数据和方法的简单封装.es6中,一个类其实也可以做到对方法 ...
- Linux java 命令行编译 jar包
Java 命令行编译成class,然后在打包成jar文件. 编译成class javac -classpath $CLASS_PATH -d class ./src/Hello.java 可以通过ja ...
- Luogu P1447 [NOI2010]能量采集
Preface 最近反演题做多了看什么都想反演.这道题由于数据弱,解法多种多样,这里简单分析一下. 首先转化下题目就是对于一个点\((x,y)\),所消耗的能量就是\(2(\gcd(x,y)-1)+1 ...
- BZOJ 4804: 欧拉心算
数论题不多BB,直接开始推导吧: \(\sum_{i=1}^n \sum_{j=1}^n \phi(gcd(i,j))\) \(=\sum_{i=1}^n \sum_{j=1}^n \sum_{d=1 ...
- 【php增删改查实例】第二十节 - 把用户管理页面集成到main.php中
把这个代码: <a href="javascript:openTab('用户管理','user/userManage.html ','icon-roleManage')" c ...
- 【php增删改查实例】第十五节 - 用户管理模块(删除确认)
假如有一天,用户找到你,说万一不小心手一抖,就点击了删除用户,不太好.能不能再误点的时候,再给个确认框,让用户进行二次确认. OK,用户是上帝.这边我们可以考虑用confirm方法进行开发. 参考代码 ...
- 【IDEA】Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目
转载请注明出处:http://blog.csdn.net/qq_26525215本文源自[大学之旅_谙忆的博客] 本篇博客讲解IDEA如何配置Tomcat. 大部分是直接上图哦. 点击如图所示的地方, ...
- 初识 tk.mybatis.mapper 通用mapper
在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...
- Mysql主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录
Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一 ...
- Adobe Photoshop CC 2015使用及扩展工具
VAdobe Photoshop CC 2015: 简称"PS",是由Adobe Systems开发和发行的图像处理软件 扩展工具: Cuuterman:切图插件: 一个一个切图, ...