【bzoj4448】SCOI2015 情报传递
树剖,可以相当于一个染色问题,以及询问先前节点的染色个数。
把第二种操作离线掉,然后用线段树模拟即可。
#include<bits/stdc++.h>
#define N 800010
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
struct Edge{int u,v,next;}G[N<<];
int head[N],tot=,wson[N],size[N],d[N],fa[N],top[N],tpos[N],pre[N],cnt,n;
struct Query{int id,t,x,y,opt;}a[N];
bool operator <(Query a,Query b){return (a.t<b.t)||(a.t==b.t&&a.opt==&&b.opt==);}
int sum[][N],rt;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int f[N];
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
void dfs1(int u,int f){
size[u]=;
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==f)continue;
fa[v]=u;d[v]=d[u]+;
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[wson[u]])wson[u]=v;
}
}
void dfs2(int u,int tp){
tpos[u]=++cnt;pre[cnt]=u;top[u]=tp;
if(wson[u])dfs2(wson[u],tp);
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==fa[u]||v==wson[u])continue;
dfs2(v,v);
}
}
struct Segment_Tree{
int cntv[N<<];
void change(int o,int l,int r,int q){
cntv[o]++;if(l==r)return;
int mid=(l+r)>>;
if(q<=mid)change(lson,l,mid,q);
else change(rson,mid+,r,q);
}
int query(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return cntv[o];
int mid=(l+r)>>,ans=;
if(ql<=mid)ans+=query(lson,l,mid,ql,qr);
if(qr>mid)ans+=query(rson,mid+,r,ql,qr);
return ans;
}
}T;
void query(int u,int v,int id){
int ans=;int xx=u,yy=v;f[id]=;
while(top[u]!=top[v]){
if(d[top[u]]<d[top[v]])swap(u,v);
ans+=T.query(,,n,tpos[top[u]],tpos[u]);u=fa[top[u]];
}
if(d[u]<d[v])swap(u,v);
ans+=T.query(,,n,tpos[v],tpos[u]);
sum[][id]=d[xx]+d[yy]-*d[v]+;sum[][id]=ans;
}
int main(){
n=read();
for(int i=;i<=n;i++){fa[i]=read();if(!fa[i])rt=i;else addedge(fa[i],i);}
dfs1(rt,);dfs2(rt,rt);int m=read();
for(int i=;i<=m;i++){
a[i].opt=read();a[i].id=i;
if(a[i].opt==){a[i].x=read();a[i].t=i;}
else{
a[i].x=read();a[i].y=read();int tmp=read();
a[i].t=i-tmp-;
}
}
sort(a+,a+m+);
for(int i=;i<=m;i++)if(a[i].opt==)T.change(,,n,tpos[a[i].x]);
else query(a[i].x,a[i].y,a[i].id);
for(int i=;i<=m;i++)if(f[i])printf("%d %d\n",sum[][i],sum[][i]);
}
【bzoj4448】SCOI2015 情报传递的更多相关文章
- bzoj4448 SCOI2015 情报传递 message
传送门bzoj4448 题解 离线之后构建树上主席树,每个点的线段树维护到根路径的信息,不用链剖(我的链剖只是拿来求\(\mathrm{lca}\)的),时空复杂度\(O(n\log{n})\). c ...
- BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)
即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...
- bzoj4448 [Scoi2015]情报传递
第一问不解释,对于第二问的处理,可以使用cdq分治,假设分治的询问区间是[L,R],那么我们对于标号在[L,mid]的修改操作赋予一个权值,因为在当前[L,R]中[L,mid]的修改操作只会对[mid ...
- 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)
传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...
- BZOJ4448[Scoi2015]情报传递——主席树+LCA
题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严 ...
- bzoj4448 [Scoi2015]情报传递 主席树+树上差分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...
- 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA
[BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...
- BZOJ_4448_[Scoi2015]情报传递_主席树
BZOJ_4448_[Scoi2015]情报传递_主席树 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有) ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- [SCOI2015]情报传递[树剖+主席树]
[SCOI2015]情报传递 题意大概就是 使得在 \(i\) 时刻加入一个情报员帮您传情报 然后询问 \(x,y,c\) 指 \(x\)到\(y\)多少个人有风险-(大于c)的都有风险-每天风险值+ ...
随机推荐
- 2011 Multi-University Training Contest 8 - Host by HUST
Rank:56/147. 开场看B,是个线段树区间合并,花了2hour敲完代码...再花了30min查错..发现push_down有问题.改了就AC了. 然后发现A过了很多人.推了个公式,发现是个分段 ...
- Andorid API Package --->android.animation
包名: android.animation Added in API level 11 URL:http://developer.andr ...
- springboot2.0 如何异步操作,@Async失效,无法进入异步
springboot异步操作可以使用@EnableAsync和@Async两个注解,本质就是多线程和动态代理. 一.配置一个线程池 @Configuration @EnableAsync//开启异步 ...
- 【题解】HNOI2016网络
整体二分是个好东西!可我忘记了它QAQ其实当你知道这题可以整体二分的时候就已经不难了(个人觉得这是最难想到的一点啊).整体二分的话,我们就可以把问题转化为是否有一条权值 \(>= k\) 的链经 ...
- bzoj1588 [HNOI2002]营业额统计 (treap)
平衡树裸题 只需要求前驱后驱 treap写法 const mm=<<; maxnumber=; maxn=; var left,right,fix,key:..maxn]of longin ...
- 存储引擎(Mysql)
最常使用的2种存储引擎:1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam.每个MyISAM在磁盘上存储成三个文件.文件名都和表名相同, ...
- BZOJ1047:[HAOI2007]理想的正方形——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 https://www.luogu.org/problemnew/show/P2216#sub ...
- BZOJ3922 Karin的弹幕 【线段树】
题目链接 BZOJ3922 题解 考虑暴力,修改\(O(1)\),查询\(O(\frac{n}{d})\) 考虑线段树,如果对每种差值建一棵线段树,修改\(O(nlogn)\),查询\(O(logn) ...
- bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)
题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...
- 推荐一款JQuery星形评级插件
jRating 是一个非常灵活的jQuery插件用于快速创建一个Ajax星型投票系统.可以设置星型数量和小数支持.功能很强大,具体大家可以看一下这个插件的js代码就知道了,下面这里演示一下这个插件有哪 ...