能够把全部的操作离线,然后树链剖分将全部人搜集情报的时间增加到主席树中,查询的时候能够直接查询搜集情报时间≤i−C[i]−1的人的个数

时间复杂度n∗log22n,空间复杂度n∗log2n

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define N 202020
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i*f;
}
int opt[N],X[N],Y[N],C[N];
int sum[N*20],ch[N*20][2],tim[N],root[N];
int fa[N],top[N],size[N],deep[N],S[N],wh[N];
int head[N],nxt[N],lst[N];
int n,m,tot,cnt,num;
void insert(int x,int y)
{
lst[++tot]=y;nxt[tot]=head[x];head[x]=tot;
}
void dfs(int x)
{
size[x]=1;
for(int i=head[x];i;i=nxt[i])
{
deep[lst[i]]=deep[x]+1;
fa[lst[i]]=x;
dfs(lst[i]);
size[x]+=size[lst[i]];
}
}
void _dfs(int x,int htp)
{
int k=0;S[x]=++cnt;top[x]=htp;wh[cnt]=x;
for(int i=head[x];i;i=nxt[i])
if(size[lst[i]]>size[k])k=lst[i];
if(!k)return ;_dfs(k,htp);
for(int i=head[x];i;i=nxt[i])
if(lst[i]!=k)_dfs(lst[i],lst[i]);
}
void add(int pre,int &x,int l,int r,int v)
{
if(!x)x=++num;
sum[x]=sum[pre]+1;
if(l==r)return;
int mid=l+r>>1;
if(v<=mid)
ch[x][1]=ch[pre][1],
add(ch[pre][0],ch[x][0],l,mid,v);
else
ch[x][0]=ch[pre][0],
add(ch[pre][1],ch[x][1],mid+1,r,v);
}
int query(int x,int y,int c)
{
int L=root[x-1],R=root[y],l=1,r=m,res=0;
while(l!=r)
{
int mid=l+r>>1;
if(c<=mid)
L=ch[L][0],R=ch[R][0],r=mid;
else
res+=sum[ch[R][0]]-sum[ch[L][0]],
L=ch[L][1],R=ch[R][1],l=mid+1;
}
res+=(c>=l?sum[R]-sum[L]:0);
return res;
}
void solve(int x,int y,int c)
{
int sum=0,res=deep[x]+deep[y];
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]])swap(x,y);
sum+=query(S[top[x]],S[x],c);x=fa[top[x]];
}
if(deep[x]<deep[y])swap(x,y);
sum+=query(S[y],S[x],c);
printf("%d %d\n",res-2*deep[y]+1,sum);
}
int main()
{
n=sc();
for(int i=1;i<=n;i++)
{
fa[i]=sc();
if(fa[i])insert(fa[i],i);
}
dfs(1);_dfs(1,1);
m=sc();
for(int i=1;i<=m;i++)
{
opt[i]=sc();
if(opt[i]==2)
tim[sc()]=i;
else X[i]=sc(),Y[i]=sc(),C[i]=sc();
}
for(int i=1;i<=n;i++)
add(root[i-1],root[i],1,m,tim[wh[i]]?tim[wh[i]]:m);
for(int i=1;i<=m;i++)
if(opt[i]==1)
solve(X[i],Y[i],i-C[i]-1);
return 0;
}

4448: [Scoi2015]情报传递|主席树|离线操作的更多相关文章

  1. bzoj 4448 [Scoi2015]情报传递 主席树

    比较套路的题目. 可以发现难点在于某个点的权值动态修改 且我们要维护树上一条路径上的点权>x的个数. 每个点都在动态修改 这意味着我们的只能暴力的去查每个点. 考虑将所有可以动态修改的点变成静态 ...

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

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

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

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

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

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

  5. 【bzoj4448】[Scoi2015]情报传递 主席树

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

  6. BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树

    4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...

  7. bzoj 4448 [Scoi2015]情报传递(主席树,LCA)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4448 [题意] 给定一颗树,询问一条路径上权值小于t-c的点数. [思路] 将一个2查 ...

  8. bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...

  9. 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)

    传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...

随机推荐

  1. 利用JS动态生成隔行换色HTML表格

    用JS生成动态生成表格,行.列由用户输入,并使表格隔行换色 方法一. 代码: <!DOCTYPE html> 2 <html> 3 <head> 4 <tit ...

  2. 计算机网络之传输层 下(TCP)

    1. TCP的特点 特点:它是一个点到点的通信机制,只能有一个发送方和一个接收方:它提供是一个可靠的,按序的字节流机制:使用流水线机制,通过拥塞控制和流量控制的机制设置窗口尺寸:发送方和接收方都有缓存 ...

  3. Linux 之 nano 编辑器的使用

    在Linux操作系统中,有很多的文本编辑器,最为重要的就是vi文本编辑器,下面来介绍一个简单的nano文本编辑器.nano的使用简单,我们可以直接加上文件名就能够打开一个旧文件或新文件,我们可以打开一 ...

  4. MySQL sys Schema

    MySQL sys Schema 使用sys Schema的先决条件 使用sys Schema sys Schema Progress Reporting sys Schema Object Refe ...

  5. 【java基础 3】树形结构数据呈现的递归算法实现

    一.基本概况 在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西. 而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递 ...

  6. 【USACO】wormholes 【暴力】

    题意:给出2K个平面上的点,给它们一一配对,问有多少种配对方法使得存在从某个点一直向右走会陷在循环里(K<=6) 思路:由于k很小,配对方法的话暴力枚举,然后判环,判环时需要注意的是一条直线上的 ...

  7. Foundation框架的一些实用方法:替换字符串,去空格,反转

    //定义一个可变字符串, Format后面可以跟字符串类型,也可以传入C语言的字符串数组 NSMutableString *str = [NSMutableString stringWithForma ...

  8. 蓝桥杯 算法提高 金属采集 [ 树形dp 经典 ]

    传送门 算法提高 金属采集 时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫 ...

  9. 七天从零基础学习android(2)--第一个安卓程序

    在环境配置的那一部分,已经把基础的环境配置好了,接下来应该实现第一个安卓程序,就是著名的hello world 先在avd里面新建一个虚拟机,并且启动它 然后该虚拟机器能够在eclipse上正常识别 ...

  10. Java的方法

    以下内容引用自http://wiki.jikexueyuan.com/project/java/methods.html: 一个Java方法是为了执行某个操作的一些语句的组合.举个例子来说,当调用Sy ...