bzoj 1146 [CTSC2008]网络管理Network
很久之前写过 count on the tree。
然后一直不懂树状数组是怎么套上这个主席树的。
看了两小时发现它套的就是个权值线段树,
看不出来可持久化在哪里。
因为动态开点所以空间nlog2n。
树状数组维护dfs序,每个节点挂个线段树。
为了省空间拿原树建了个主席树。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 80005
using namespace std;
int n,q;
int t[N];
int head[N],ver[N*],nxt[N*],tot;
int li[N*],now[N*],cnt;
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
struct node
{
int k,a,b;
}qq[N];
int zz,st[N],ed[N];
int dep[N];
int fa[N][];
void lca()
{
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=;i>=;i--)
{
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];y=fa[y][i];
}
}
return fa[x][];
}
void dfs(int x,int f)
{
st[x]=++zz;
for(int i=head[x];i;i=nxt[i])
{
if(ver[i]==f)continue;
fa[ver[i]][]=x;
dep[ver[i]]=dep[x]+;
dfs(ver[i],x);
}
ed[x]=zz;
}
int root[N],rot[N];
struct Node
{
int l,r,sum;
}a[N*];
int num; void inrt(int x,int y,int l,int r,int pos)
{
if(l==r)
{
a[x].sum=a[y].sum+;
return ;
}
int mid=(l+r)>>;
if(pos<=mid)
{
if(!a[x].l)a[x].l=++num;
a[x].r=a[y].r;
inrt(a[x].l,a[y].l,l,mid,pos);
}
else
{
if(!a[x].r)a[x].r=++num;
a[x].l=a[y].l;
inrt(a[x].r,a[y].r,mid+,r,pos);
}
a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
}
void build()
{
for(int i=;i<=n;i++)
{
if(!rot[i])rot[i]=++num;
inrt(rot[i],rot[fa[i][]],,cnt,now[i]);
}
}
void insert(int x,int l,int r,int pos,int z)
{
if(l==r)
{
a[x].sum+=z;return ;
}
int mid=(l+r)>>;
if(pos<=mid)
{
if(!a[x].l)a[x].l=++num;
insert(a[x].l,l,mid,pos,z);
}
else
{
if(!a[x].r)a[x].r=++num;
insert(a[x].r,mid+,r,pos,z);
}
a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
}
void ad(int x,int z,int la)
{
for(int i=x;i<=n;i+=(i&(-i)))
{
if(!root[i])root[i]=++num;
insert(root[i],,cnt,z,la);
}
return ;
}
int no[N][];
int t1,t2,t3,t4;
int qur(int x,int y)
{
int as=;
for(int i=x;i;i-=(i&(-i)))
{
as+=a[a[no[i][y]].l].sum;
}
return as;
}
int qur(int l,int r,int kk,int r1,int r2,int r3,int r4)
{
if(l==r)
{
return l;
}
int mid=(l+r)>>;
int xx=a[a[r3].l].sum+a[a[r4].l].sum-a[a[r1].l].sum-a[a[r2].l].sum;
xx+=qur(st[t1],);xx+=qur(st[t2],);
xx-=qur(st[t3],);xx-=qur(st[t4],);
if(xx>=kk)
{
for(int i=st[t1];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
for(int i=st[t2];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
for(int i=st[t3];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
for(int i=st[t4];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
return qur(l,mid,kk,a[r1].l,a[r2].l,a[r3].l,a[r4].l);
}
else
{
for(int i=st[t1];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
for(int i=st[t2];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
for(int i=st[t3];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
for(int i=st[t4];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
return qur(mid+,r,kk-xx,a[r1].r,a[r2].r,a[r3].r,a[r4].r);
}
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)scanf("%d",&t[i]),li[++cnt]=t[i];
for(int i=;i<n;i++)
{
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
}
for(int i=;i<=q;i++)
{
scanf("%d%d%d",&qq[i].k,&qq[i].a,&qq[i].b);
if(!qq[i].k)li[++cnt]=qq[i].b;
}
sort(li+,li+cnt+);
cnt=unique(li+,li+cnt+)-li-;
for(int i=;i<=n;i++)now[i]=lower_bound(li+,li+cnt+,t[i])-li;
dep[]=;dfs(,-);
lca();
build();
for(int i=;i<=q;i++)
{
if(!qq[i].k)
{
ad(st[qq[i].a],now[qq[i].a],-);
if(ed[qq[i].a]!=zz)ad(ed[qq[i].a]+,now[qq[i].a],);
now[qq[i].a]=lower_bound(li+,li+cnt+,qq[i].b)-li;
ad(st[qq[i].a],now[qq[i].a],);
if(ed[qq[i].a]!=zz)ad(ed[qq[i].a]+,now[qq[i].a],-);
}
else
{
int tmp=lca(qq[i].a,qq[i].b);
int yy=dep[qq[i].a]+dep[qq[i].b]-dep[tmp]*+;
if(yy<qq[i].k)
{
puts("invalid request!");
continue;
}
else
{
yy=yy-qq[i].k+;
for(int j=st[qq[i].a];j;j-=(j&(-j)))no[j][]=root[j];
for(int j=st[qq[i].b];j;j-=(j&(-j)))no[j][]=root[j];
for(int j=st[tmp];j;j-=(j&(-j)))no[j][]=root[j];
for(int j=st[fa[tmp][]];j;j-=(j&(-j)))no[j][]=root[j];
t1=qq[i].a;t2=qq[i].b;t3=tmp;t4=fa[tmp][];
int tp=qur(,cnt,yy,rot[tmp],rot[fa[tmp][]],rot[qq[i].a],rot[qq[i].b]);
printf("%d\n",li[tp]);
}
}
}
return ;
}
bzoj 1146 [CTSC2008]网络管理Network的更多相关文章
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
- BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 870 Solved: 299[Submit] ...
- BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- BZOJ 1146: [CTSC2008]网络管理Network 带修改主席树_树套树_DFS序
Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路 ...
- [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理
令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...
- [BZOJ1146][CTSC2008]网络管理Network
[BZOJ1146][CTSC2008]网络管理Network 试题描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建 ...
- Luogu4175:[CTSC2008]网络管理Network
题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...
随机推荐
- 工作中常用的js、jquery自定义扩展函数代码片段
仅记录一些我工作中常用的自定义js函数. 1.获取URL请求参数 //根据URL获取Id function GetQueryString(name) { var reg = new RegExp(&q ...
- RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化
序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用.然我们自己动手从0开始写一个rpc功能以及实 ...
- 3.1 js基本概念
js中的语法大量借鉴于C以及其他类C语言(Java,Perl). js中一切(变量.函数名.操作符等等)都区分大小写.如"var a;"中的变量a跟"var A;&quo ...
- CentOS7上安装QGIS
1.加入YUM源 rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm ...
- Android 7.0 Nougat牛轧糖 发布啦
Android 7.0 Nougat牛轧糖 发布啦 Android 7.0 Nougat 牛轧糖于本月发布了. 从官方blog里可以了解到这个版本的新特性. Android 7.0 从2016年8月正 ...
- android环境下的即时通讯
首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...
- android Intent介绍
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...
- Highcharts配置
一.基础使用 <script src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script> ...
- python基础(1) 变量类型
变量赋值: python中的变量不需要类型声明 每个变量在使用前必须赋值,变量赋值以后才会被创建 变量在内存中创建时,包括变量的标识.名称和数据这些信息. EX: #!/usr/bin/python ...
- Spring类型转换 ConversionSerivce Convertor
以String转Date为例: 定义转换器: import java.text.ParseException; import java.util.Date; import org.apach ...