题目大意:给你一棵树,有两种操作,一个是修改某个点的权值,另一个是询问两点之间的距离以及路径上小于某个值的数的个数。

询问两点之间距离直接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]情报传递的更多相关文章

  1. bzoj4448 SCOI2015 情报传递 message

    传送门bzoj4448 题解 离线之后构建树上主席树,每个点的线段树维护到根路径的信息,不用链剖(我的链剖只是拿来求\(\mathrm{lca}\)的),时空复杂度\(O(n\log{n})\). c ...

  2. BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)

    即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...

  3. bzoj4448 [Scoi2015]情报传递

    第一问不解释,对于第二问的处理,可以使用cdq分治,假设分治的询问区间是[L,R],那么我们对于标号在[L,mid]的修改操作赋予一个权值,因为在当前[L,R]中[L,mid]的修改操作只会对[mid ...

  4. 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)

    传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...

  5. BZOJ4448[Scoi2015]情报传递——主席树+LCA

    题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严 ...

  6. bzoj4448 [Scoi2015]情报传递 主席树+树上差分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...

  7. OI刷题录——hahalidaxin

    16-3-25  —— bzoj 2049 [Sdoi2008]Cave 洞穴勘测:LCT入门 bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊:LCT Tsinsen A1303. t ...

  8. 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA

    [BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...

  9. bzoj4448 情报传递

    题目链接 离线+树上主席树,主席树维护时间标记 注意查询时如果c<0要把c赋为0: #include<iostream> #include<cstdio> #includ ...

随机推荐

  1. AOP静态代理解析2-代码织入

    当我们完成了所有的AspectJ的准备工作后便可以进行织入分析了,首先还是从LoadTimeWeaverAwareProcessor开始. LoadTimeWeaverAwareProcessor实现 ...

  2. poj 2774 Long Long Message 后缀数组基础题

    Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 24756   Accepted: 10130 Case Time Limi ...

  3. AutoMapper简明教程(学习笔记)

    ].FirstName + nameDto12[].LastName);Console.WriteLine();//Console.ReadKey();//emitMapper error//List ...

  4. 静态成员函数(面向对象的static关键字)

    静态成员函数 与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是某一个类的具体对象服务.静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分.普通的成员函数一般 ...

  5. 接口测试第二课(Fiddler实现APP抓包)

    Fiddler简介: Fiddler是强大且好用的Web调试工具之一,它能记录客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数 据. Fiddler 的运行机制其实就 ...

  6. 关于把世界坐标投射到屏幕上转换为屏幕2D坐标

    如果使用使用Project World to Screen 在一些分辨率一下就出现坐标错误. 比如我设置的UMG分辨率为1280*720,但是他的(1280,720)的坐标并不在UMG的右下角的边缘上 ...

  7. BZOJ4568 : [Scoi2016]幸运数字

    树的点分治,每次求出重心后,求出重心到每个点路径上的数的线性基. 对于每个询问,只需要暴力合并两个线性基即可. 时间复杂度$O(60n\log n+60^2q)$. #include<cstdi ...

  8. js定时相关函数:

    定时相关函数: mytime= setTimeout(vCode, iMilliSeconds [, sLanguage]) -- 单次定时执行指定函数 clearTimeout(iTimeoutID ...

  9. Storm系统高可用性HA表现

    关于Storm的高可用,有以下几个方面: (1)数据利用阶段可以通过ACK机制保证数据被处理: (2)在进程级别,worker失效,supervisor会自动重启worker线程; (3)在组件级别, ...

  10. oracle 函数大全及运算符

    http://blog.csdn.net/huangwuyi/article/details/7407820 一.函数 1.取整  mod(2,10)=2 2.取整 trunc(12/10)=1 3. ...