bzoj 4448 [Scoi2015]情报传递 主席树
比较套路的题目。
可以发现难点在于某个点的权值动态修改 且我们要维护树上一条路径上的点权>x的个数。
每个点都在动态修改 这意味着我们的只能暴力的去查每个点。
考虑将所有可以动态修改的点变成静态的 这样查询好查 那么外部需要一个动态的标记 且这个标记适用于所有点。
不难想到我们的循环标记i 即第i次操作 将这个东西变成每个点的标记 就可以刚好和题目中的动态修改吻合了。
一个点此刻被打上动态修改标记 那么其权值的变化量为-i 因为外面有一个+i的标记了 这个标记时刻也在变和题目吻合。
此时我们需要处理的只有树上某个点权值会变树上某条路径上>x的点的个数。
只能考虑主席树了(发现这个问题还不是很好解决
dfs序上建立主席树 利用对LCA的容斥即可解决问题。
由于存在单点修改 外面套一个树状数组即可。码量过大 不妨考虑离线。
考虑一个没有被修改过的点 其实不需要赋值相当于没有即可。
考虑我们询问的形式为 当前时间 x+now>c c-now-x now-c>i 也就是查询now-c之前被修改过的点。
对于一个询问 now-c来说我们考虑之后被修改过的点至少为now+1 而由于c>0 所以now-c<now+1.
所以后面的修改对前面的没有任何的影响所以可以直接 树上建立主席树来离线查询。
数据范围 是简化程序的基础。
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define pii pair<int,int>
#define F first
#define S second
#define mk make_pair
#define RE register
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define ull unsigned long long
#define P 1000000000000000ll
#define l(p) t[p].l
#define r(p) t[p].r
#define sum(p) t[p].sum
#define ls l(p),l,mid
#define rs r(p),mid+1,r
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=200010;
int n,len,id,m,cnt;
int a[MAXN],root[MAXN];
int f[MAXN][20],Log[MAXN],d[MAXN];
int lin[MAXN],ver[MAXN],nex[MAXN];
struct wy{int l,r;int sum;}t[MAXN*30],w[MAXN];
inline void add(int x,int y){ver[++len]=y;nex[len]=lin[x];lin[x]=len;}
inline void insert(int &p,int l,int r,int las,int x)
{
p=++id;t[p]=t[las];
if(l==r){++sum(p);return;}
int mid=(l+r)>>1;
if(x<=mid)insert(ls,l(las),x);
else insert(rs,r(las),x);
sum(p)=sum(l(p))+sum(r(p));
}
inline void dfs(int x,int fa)
{
d[x]=d[fa]+1;
rep(1,Log[d[x]],i)f[x][i]=f[f[x][i-1]][i-1];
if(a[x])insert(root[x],1,m,root[fa],a[x]);
else root[x]=root[fa];
go(x)dfs(tn,x);
}
inline int LCA(int x,int y)
{
if(d[x]<d[y])swap(x,y);
fep(Log[d[x]],0,i)if(d[f[x][i]]>=d[y])x=f[x][i];
if(x==y)return x;
fep(Log[d[x]],0,i)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
inline int ask(int p,int l,int r,int x)
{
if(x<=0)return 0;
if(r<=x)return sum(p);
int mid=(l+r)>>1;
if(x<=mid)return ask(ls,x);
return ask(ls,x)+ask(rs,x);
}
int main()
{
//freopen("1.in","r",stdin);
get(n);int rt;Log[0]=-1;
rep(1,n,i)
{
f[i][0]=read();
if(!f[i][0])rt=i;
else add(f[i][0],i);
Log[i]=Log[i>>1]+1;
}
get(m);
rep(1,m,i)
{
int op,l,r,x;
get(op);get(l);
if(op==1)get(r),get(x),w[++cnt]=(wy){l,r,i-x};
else a[l]=i;
}
dfs(rt,0);
rep(1,cnt,i)
{
int lca=LCA(w[i].l,w[i].r);
int L=w[i].l,R=w[i].r;
int ww=w[i].sum-1;
//cout<<-ask(root[lca],1,m,ww)*2<<endl;
//put(ask(root[L],1,m,ww));
printf("%d %d\n",d[L]+d[R]-2*d[lca]+1,ask(root[L],1,m,ww)+ask(root[R],1,m,ww)-ask(root[lca],1,m,ww)*2+(a[lca]<=ww&&a[lca]));
}
return 0;
}
bzoj 4448 [Scoi2015]情报传递 主席树的更多相关文章
- 4448: [Scoi2015]情报传递|主席树|离线操作
能够把全部的操作离线,然后树链剖分将全部人搜集情报的时间增加到主席树中,查询的时候能够直接查询搜集情报时间≤i−C[i]−1的人的个数 时间复杂度n∗log22n,空间复杂度n∗log2n #incl ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- bzoj 4448 [Scoi2015]情报传递(主席树,LCA)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4448 [题意] 给定一颗树,询问一条路径上权值小于t-c的点数. [思路] 将一个2查 ...
- bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...
- 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA
[BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...
- bzoj4448 [Scoi2015]情报传递 主席树+树上差分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...
- bzoj 4448: [Scoi2015]情报传递
Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线.奈 ...
- BZOJ4448[Scoi2015]情报传递——主席树+LCA
题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严 ...
- 【bzoj4448】[Scoi2015]情报传递 主席树
题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严, ...
随机推荐
- 51Nod 1683 最短路
题意 给定一个未知的\(0/1\)矩阵,对每个\(i\)求\((1,1)\sim(n,m)\)最短路为\(i\)的概率,在矩阵中不能向左走,路径长度为路径上权值为\(1\)的格子个数. \(n\leq ...
- POJ2376贪心
题意:数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1,t](1<=t<=1,000,000).覆盖整点,即[1,2] ...
- 深入浅出了解CDN
背景: 本文公众号来源:漫话编程 虎牙直播2000W+人在线观看,直播间还不卡,据了解,2018年1月,阿里云为虎牙提供了边缘节点服务(ENS).基于阿里云ENS,可以轻松地将业务模块放到边缘运行,在 ...
- 002.Nginx安装及启动
一 Nginx yum安装 1.1 前置准备 1 [root@nginx01 ~]# systemctl status firewalld.service #检查防火墙 2 [root@nginx01 ...
- .NET程序运行原理及基本概念详解
一.引言 我们知道在Java中有虚拟机,代码运行时虚拟机把Java语言编译成与机器无关的字节码,然后再把字节码编译成机器指令执行,那么在.NET中程序是如何运行的呢?其实运行原理是一样的,.NET中的 ...
- linux专题(一):小白的开始以及相关的学习链接
转载自:https://www.cnblogs.com/ggjucheng/archive/2011/12/16/2290158.html 学习Linux也有一阵子了,这过程中磕磕撞撞的,遇到了问题, ...
- celery 基础教程(三):配置
前言 如果你使用默认的加载器,你必须创建 celeryconfig.py 模块并且保证它在python路径中. 一.加载配置方法 1.基础方法 可以设置一些选项来改变 Celery 的工作方式.这 ...
- 数据可视化之DAX篇(六) 利用ISINSCOPE函数,轻松按层级计算占比
https://zhuanlan.zhihu.com/p/70590683 关于占比,之前有篇文章(利用ALL和ALLSELECTED灵活计算占比)详细介绍了各种情况下占比的度量值. 经星友咨询,还有 ...
- 数据可视化之DAX篇(十三)熟练使用FORMAT函数,轻松自定义数据格式
https://zhuanlan.zhihu.com/p/64420449 在进行数据分析时,需要对某个数据进行格式调整的情形经常会遇到,在DAX中有一个专门进行格式调整的函数:FORMAT. 其实对 ...
- git的工作区和暂存区
目录 备注: 知识点 工作区(Working Directory) 版本库(Repository) 备注: 本文参考于廖雪峰老师的博客Git教程.依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查 ...