BZOJ4448[Scoi2015]情报传递——主席树+LCA
题目描述
输入
输出
样例输入
0 1 1 2 2 3 3
6
1 4 7 0
2 1
2 4
2 7
1 4 7 1
1 4 7 3
样例输出
5 2
5 1
提示
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int opt;
int x,y;
int z;
}a[200010];
int n,m;
int tot;
int cnt;
int rot;
int v[200010];
int d[200010];
int to[200010];
int ls[6000010];
int rs[6000010];
int sum[6000010];
int root[1000010];
int head[200010];
int next[200010];
int f[200010][20];
void add(int x,int y)
{
tot++;
next[tot]=head[x];
head[x]=tot;
to[tot]=y;
}
void dfs(int x,int fa)
{
d[x]=d[fa]+1;
for(int i=1;i<=19;i++)
{
f[x][i]=f[f[x][i-1]][i-1];
}
for(int i=head[x];i;i=next[i])
{
dfs(to[i],x);
}
}
int lca(int x,int y)
{
if(d[x]<d[y])
{
swap(x,y);
}
int dep=d[x]-d[y];
for(int i=0;i<=19;i++)
{
if((dep&(1<<i))!=0)
{
x=f[x][i];
}
}
if(x==y)
{
return x;
}
for(int i=19;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int updata(int pre,int l,int r,int k)
{
int rt=++cnt;
if(l==r)
{
sum[rt]++;
return rt;
}
ls[rt]=ls[pre];
rs[rt]=rs[pre];
sum[rt]=sum[pre]+1;
int mid=(l+r)>>1;
if(k<=mid)
{
ls[rt]=updata(ls[pre],l,mid,k);
}
else
{
rs[rt]=updata(rs[pre],mid+1,r,k);
}
return rt;
}
void build(int x,int fa)
{
root[x]=root[fa];
if(v[x]!=0)
{
root[x]=updata(root[fa],1,m,v[x]);
}
for(int i=head[x];i;i=next[i])
{
build(to[i],x);
}
}
int query(int x,int y,int fa,int anc,int l,int r,int k)
{
if(l==r)
{
return sum[x]+sum[y]-sum[fa]-sum[anc];
}
int res=sum[ls[x]]+sum[ls[y]]-sum[ls[fa]]-sum[ls[anc]];
int mid=(l+r)>>1;
if(k<=mid)
{
return query(ls[x],ls[y],ls[fa],ls[anc],l,mid,k);
}
else
{
return res+query(rs[x],rs[y],rs[fa],rs[anc],mid+1,r,k);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&f[i][0]);
add(f[i][0],i);
}
for(int i=1;i<=n;i++)
{
if(f[i][0]==0)
{
rot=i;
dfs(i,0);
break;
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i].opt);
if(a[i].opt==1)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
}
else
{
scanf("%d",&a[i].z);
v[a[i].z]=i;
}
}
build(rot,0);
for(int i=1;i<=m;i++)
{
if(a[i].opt==1)
{
int anc=lca(a[i].x,a[i].y);
printf("%d ",d[a[i].x]+d[a[i].y]-d[anc]-d[f[anc][0]]);
if(i-a[i].z-1<=0)
{
printf("0\n");
continue;
}
printf("%d\n",query(root[a[i].x],root[a[i].y],root[anc],root[f[anc][0]],1,m,i-a[i].z-1));
}
}
}
BZOJ4448[Scoi2015]情报传递——主席树+LCA的更多相关文章
- 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA
[BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...
- bzoj4448 [Scoi2015]情报传递 主席树+树上差分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...
- 【bzoj4448】[Scoi2015]情报传递 主席树
题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严, ...
- bzoj 4448 [Scoi2015]情报传递 主席树
比较套路的题目. 可以发现难点在于某个点的权值动态修改 且我们要维护树上一条路径上的点权>x的个数. 每个点都在动态修改 这意味着我们的只能暴力的去查每个点. 考虑将所有可以动态修改的点变成静态 ...
- 4448: [Scoi2015]情报传递|主席树|离线操作
能够把全部的操作离线,然后树链剖分将全部人搜集情报的时间增加到主席树中,查询的时候能够直接查询搜集情报时间≤i−C[i]−1的人的个数 时间复杂度n∗log22n,空间复杂度n∗log2n #incl ...
- Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)
Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...
- BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)
即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...
- 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)
传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...
- bzoj4448 SCOI2015 情报传递 message
传送门bzoj4448 题解 离线之后构建树上主席树,每个点的线段树维护到根路径的信息,不用链剖(我的链剖只是拿来求\(\mathrm{lca}\)的),时空复杂度\(O(n\log{n})\). c ...
随机推荐
- python_第一章
从今天开始,正式开始学习python书籍:python 编程:从入门到实践. 感兴趣的读者可以去网上搜索这本书,适合读者入门,读下来,不会有任何 晦涩难懂的知识. 1.排序: 正排:sort() ...
- Linux_软件安装管理
开始学习rpm,yum等命令的使用,下面的地址可供你学习 大部分都大同小异! 感谢作者:https://segmentfault.com/a/1190000011200461
- [Spark][Python]DataFrame select 操作例子II
[Spark][Python]DataFrame中取出有限个记录的 继续 In [4]: peopleDF.select("age","name") In ...
- BodeAbp前端介绍
BodeAbp的前端可以根据自己的喜好选型,推荐React.js.angular2.js.vue.js,后续我会以react.js为例说明BodeAbp前端的一些设计思路. BodeAbp提供的前端d ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
来个目录吧: 第一章-入门 第二章- Entity Framework Core Nuget包管理 第三章-创建.修改.删除.查询 第四章-排序.过滤.分页.分组 第五章-迁移,EF Core 的co ...
- 5分钟入门自动化测试——你应该学会的Postman用法(2)
前言 之前的一篇文章<你应该学会的Postman用法>,主要介绍了postman的一些高级的用法,便于日常开发和调试使用,本文的基础是对postman的基本使用以及一些高级用法有一定的了解 ...
- 时区提示:Local time zone must be set--see zic manual page 2018的解决办法
问题描述:在centos服务器上执行date命令时,显示的时间信息中的时区不正常,如下: [root@ulocalhost ~]# date Mon Apr 9 02:57:38 Local time ...
- Keepalived基础知识-运维小结
keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...
- cross-env简介
是什么 运行跨平台设置和使用环境变量的脚本 出现原因 当您使用NODE_ENV =production, 来设置环境变量时,大多数Windows命令提示将会阻塞(报错). (异常是Windows上的B ...
- Visual Studio平台安装及测试
一.VS安装 图1.1 图1.2 二.单元测试练习 题目:课本22~25页单元测试练习 1.创建一个c#类(具体如下:打开VS2010,然后点击VS界面上左上角的文件按钮,然后点击文件—新建—项目,就 ...