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框架学习之旅 - 生命周期 及原理说明
生命周期 name avatars company constructor 构造函数 new的时候 install 初始化安装,这可以拿到用户传进的data进行处理 实例化 installed 安装完 ...
- oa tomcat 代码处理跨域问题
meta标签处理http.https跨域 <!-- 将http请求转成https请求 --> <meta http-equiv="Content-Security-Poli ...
- Flutter - BottomNavigationBar底部导航栏切换后,状态丢失
如果你用过BottomNavigationBar.TabBar.还有Drawer,你就会发现,在切换页面之后,原来的页面状态就会丢失. 要是上一页有一个数据列表,很多数据,你滚动到了下头,切换页面后, ...
- KVM虚拟机管理——资源调整
1. 概述2. 计算资源调整2.1 调整处理器配置2.2 调整内存配置3. 存储资源调整3.1 根分区扩展3.2 添加磁盘4. 网络资源调整 1. 概述 KVM在使用过程中,会涉及到计算(CPU,内存 ...
- 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一orm篇【如EF般丝滑】typeorm介绍(8/8)
文章目录 前情概要 在使用nodejs开发过程中,刚好碰到需要做一个小工具,需要用到数据库存储功能.而我又比较懒,一个小功能不想搞一个nodejs项目,又搞一个后端项目.不如直接在nodejs里面把对 ...
- 基于HTML5 Canvas WebGL制作分离摩托车
工业方面制作图表,制作模型方面运用到 3d 模型是非常多的,在一个大的环境中,构建无数个相同的或者不同的模型,构建起来对于程序员来说也是一件相当头疼的事情,我们利用 HT 帮大家解决了很大的难题,无数 ...
- 计算机网络什么是OSI7层模型、TCP/IP4层模型理解
模型图解 应用层 就是最顶层的.通常指的应用程序初始走的协议比如有 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 主要对数据应用层的数据包进行加密 会话层 建立.管理. ...
- Spring Cloud :断路器集群监控(Turbine)
一. 简介 上一篇文章我们已经实现了对单个服务实例的监控,当然在实际应用中,单个实例的监控数据没有多大的价值,我们更需要的是一个集群系统的监控信息,这时我们就需要引入Turbine.Turb ...
- Daily Scrumming* 2015.12.21(Day 13)
一.团队scrum meeting照片 大部分成员编译请假,故今天没有开scrum meeting 二.成员工作总结 姓名 任务ID 迁入记录 江昊 无 无 任务说明: 今日准备编译测验,请假 遇到问 ...
- 《Linux内核设计与实现》读书笔记 3
第三章 进程管理 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于程序,还包含其他资源(打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内催音社的内存地址空间及一个或多个执行线 ...