BZOJ4448:[SCO2015]情报传递
题目大意:给你一棵树,有两种操作,一个是修改某个点的权值,另一个是询问两点之间的距离以及路径上小于某个值的数的个数。
询问两点之间距离直接lca即可,对于求个数的问题可以用主席树完成。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=;char ch=getchar();
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';ch=getchar())s=s*+ch-'';
return s;
}
int N,Q;
struct node{
int opt,x,y,c,t;
}q[];
int to[],next[],tot,h[];
int root[],ls[],rs[],size[];
int c[],rt,cnt;
int fa[][],dep[];
void add(int x,int y){
tot++;to[tot]=y;next[tot]=h[x];h[x]=tot;
}
void insert(int l,int r,int Ort,int Nrt,int x){
if(l==r){size[Nrt]=size[Ort]+;return;}
int mid=(l+r)>>;
if(x<=mid){
ls[Nrt]=++cnt;
rs[Nrt]=rs[Ort];
insert(l,mid,ls[Ort],ls[Nrt],x);
}else{
rs[Nrt]=++cnt;
ls[Nrt]=ls[Ort];
insert(mid+,r,rs[Ort],rs[Nrt],x);
}
size[Nrt]=size[ls[Nrt]]+size[rs[Nrt]];
}
void dfs(int x){
for(int i=;i<=;++i)
if(dep[x]<(<<i))break;
else fa[x][i]=fa[fa[x][i-]][i-];
for(int i=h[x];i;i=next[i]){
int v=to[i];
if(dep[v])continue;
dep[v]=dep[x]+;
fa[v][]=x;
if(c[v])insert(,Q,root[x],root[v]=++cnt,c[v]);
else root[v]=root[x];
dfs(v);
}
}
void init(){
N=read();
for(int i=;i<=N;++i){
int x=read();
if(x==)rt=i;
else add(x,i);
}
Q=read();
for(int i=;i<=Q;++i){
q[i].opt=read();
if(q[i].opt==)q[i].x=read(),q[i].y=read(),q[i].c=read();
else{
q[i].t=read();
if(!c[q[i].t])c[q[i].t]=i;
}
}
dep[rt]=;
if(c[rt])insert(,Q,root[],root[rt]=++cnt,c[rt]);
dfs(rt);
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
int d=dep[x]-dep[y];
for(int i=;i<=;++i)
if(d&(<<i))
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];
if(x==y)return x;
return fa[x][];
}
int ask(int l,int r,int rrt,int lrt,int x){
if(x<=)return ;
if(l==r)return size[rrt]-size[lrt];
int mid=(l+r)>>;
if(x<=mid)return ask(l,mid,ls[rrt],ls[lrt],x);
else return size[ls[rrt]]-size[ls[lrt]]+ask(mid+,r,rs[rrt],rs[lrt],x);
}
void work(){
for(int i=;i<=Q;++i){
if(q[i].opt==){
int k=lca(q[i].x,q[i].y);
int k1=dep[q[i].x]+dep[q[i].y]-*dep[k]+;
int k2=ask(,Q,root[q[i].x],root[fa[k][]],i-q[i].c-)+ask(,Q,root[q[i].y],root[k],i-q[i].c-);
printf("%d %d\n",k1,k2);
}
}
}
int main(){
init();
work();
return ;
}
BZOJ4448:[SCO2015]情报传递的更多相关文章
- 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 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...
- OI刷题录——hahalidaxin
16-3-25 —— bzoj 2049 [Sdoi2008]Cave 洞穴勘测:LCT入门 bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊:LCT Tsinsen A1303. t ...
- 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA
[BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...
- bzoj4448 情报传递
题目链接 离线+树上主席树,主席树维护时间标记 注意查询时如果c<0要把c赋为0: #include<iostream> #include<cstdio> #includ ...
随机推荐
- hdu1114 完全背包
题意:给出钱罐的重量,然后是每种钱的价值和重量,问钱罐里最少可能有多少钱. 完全背包. 代码: #include<iostream> #include<cstdio> #inc ...
- Uva 11988 Broken Keyboard
因为要经常移动这些字符,所以采用的数据结构是链表. next[i]起到的作用大概就是类似链表里的next指针. 0.需要注意的是,判断cur == last ? 如果 是 则 last=i 1.另外一 ...
- 20145223《Java程序程序设计》第8周学习总结
20145223 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 ·NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区 ...
- 并查集(删除) UVA 11987 Almost Union-Find
题目传送门 题意:训练指南P246 分析:主要是第二种操作难办,并查集如何支持删除操作?很巧妙的方法:将并查集树上p的影响消除,即在祖先上(sz--, sum -= p),然后为p换上马甲:id[p] ...
- MyEclipse代码自动补全设置
1.打开 Eclipse -> Window -> Perferences -> Java -> Editor -> Content Assist,在右边最下面一栏找到 ...
- HDU5772 String problem(最大权闭合子图)
题目..说了很多东西 官方题解是这么说的: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个 ...
- apache htpasswd.exe创建密码
一.使用apache htpasswd.exe创建密码文件,命令请看PHP推荐教程:apache htpasswd命令用法详解 apache htpasswd命令用法实例 1.如何利用htpasswd ...
- 编程之路 - 写给打算进入IT行业的新人们
IT=挨踢,这是IT人的自嘲,进入IT行业是有四五年了,也算得上是一个“老人”了吧,见了不少新人,面试了不少新人,也带了一些新人,多多少少还是有点发言权的. 关于书本 新人们常常会说我看了多少多少的书 ...
- [ JS 进阶 ] test, exec, match, replace
https://segmentfault.com/a/1190000003497780 对了,这篇文章可能会涉及到正则表达式相关知识,所以推荐没有正则基础的去看看这篇入门文章:正则表达式30分钟入门教 ...
- Android 实用开源控件
图片放大缩小: PinchImageView 体验最好的图片手势控件,不同分辨率无缝切换,可与ViewPager结合使用. GestureViews 带有手势控制的ImageView和FrameLay ...