传送门

题意简述:

给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务:

1.搜集情报:指派T号情报员搜集情报

2.传递情报:将一条情报从X号情报员传递给Y号情报员

一个情报员在搜集情报之前危险度为000,从开始搜集的第二天起每天危险度加一。

每条情报都有一个风险控制值C,现在要求对于每个任务,参与传递的情报员有多少个,其中对危险度大于这条情报的CCC值的情报员有多少个。


思路:

对于第一个问题显然求lcalcalca就完了,对于第二个问题我们可以离线排序,我们不妨令一个情报员开始搜集情报的时间和每条情报的出现时间都记作vvv。

那么一个点iii可能对一条情报jjj产生贡献当且仅当vi&lt;vj−cjv_i&lt;v_j-c_jvi​<vj​−cj​,因此我们把情报员按照vvv排序,把情报按照v−cv-cv−c排序。

然后用一个归并排序来决定修改查询的顺序,这样只用一个树链剖分维护一下就完了。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
	static char buf[rlen],*ib,*ob;
	(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
	return ib==ob?-1:*ib++;
}
inline int read(){
	int ans=0;
	char ch=gc();
	while(!isdigit(ch))ch=gc();
	while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
	return ans;
}
const int N=2e5+5;
int n,m,siz[N],hson[N],top[N],fa[N],dep[N],num[N],ans[N],len[N],tot=0;
bool vis[N];
vector<int>e[N];
namespace Bit{
	int bit[N];
	inline int lowbit(const int&x){return x&-x;}
	inline void update(int x,int v){for(ri i=x;i<=n;i+=lowbit(i))bit[i]+=v;}
	inline int query(int x){int ret=0;for(ri i=x;i;i^=lowbit(i))ret+=bit[i];return ret;}
}
void dfs1(int p){
	siz[p]=1;
	for(ri i=0,v;i<e[p].size();++i){
		fa[v=e[p][i]]=p,dep[v]=dep[p]+1,dfs1(v),siz[p]+=siz[v];
		if(siz[v]>siz[hson[p]])hson[p]=v;
	}
}
void dfs2(int p,int tp){
	top[p]=tp,num[p]=++tot;
	if(!hson[p])return;
	dfs2(hson[p],tp);
	for(ri i=0,v;i<e[p].size();++i)if((v=e[p][i])!=hson[p])dfs2(v,v);
}
inline int lca(int x,int y){
	while(top[x]^top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		x=fa[top[x]];
	}
	return dep[x]<dep[y]?x:y;
}
inline int query(int x,int y){
	int ret=0;
	while(top[x]^top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ret+=Bit::query(num[x])-Bit::query(num[top[x]]-1),x=fa[top[x]];
	}
	if(dep[x]<dep[y])swap(x,y);
	return ret+Bit::query(num[x])-Bit::query(num[y]-1);
}
struct Upd{int x,v;friend inline bool operator<(const Upd&a,const Upd&b){return a.v<b.v;}}upd[N];
struct Qry{int x,y,id,v;friend inline bool operator<(const Qry&a,const Qry&b){return a.v<b.v;}}qry[N];
int main(){
	n=read();
	int rt,t1=0,t2=0,p1=1,p2=1;
	for(ri i=1;i<=n;++i)if(!(fa[i]=read()))rt=i;else e[fa[i]].push_back(i);
	dfs1(rt),dfs2(rt,rt);
	m=read();
	for(ri op,x,y,v,i=1;i<=m;++i){
		op=read();
		if(op==2)upd[++t1]=(Upd){read(),i};
		else{
			x=read(),y=read(),v=read(),++t2;
			qry[t2]=(Qry){x,y,t2,i-v-1};
			len[t2]=dep[x]+dep[y]-dep[lca(x,y)]*2+1;
		}
	}
	sort(upd+1,upd+t1+1),sort(qry+1,qry+t2+1);
	while(p1<=t1&&p2<=t2){
		if(upd[p1].v<=qry[p2].v){if(!vis[upd[p1].x])Bit::update(num[upd[p1].x],1),vis[upd[p1].x]=1;++p1;}
		else ans[qry[p2].id]=query(qry[p2].x,qry[p2].y),++p2;
	}
	while(p2<=t2)ans[qry[p2].id]=query(qry[p2].x,qry[p2].y),++p2;
	for(ri i=1;i<=t2;++i)cout<<len[i]<<' '<<ans[i]<<'\n';
	return 0;
}

2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)的更多相关文章

  1. 2019.01.20 bzoj3999: [TJOI2015]旅游(树链剖分)

    传送门 树链剖分菜题. 题意不清差评. 题意简述(保证清晰):给一棵带权的树,每次从aaa走到bbb,在走过的路径上任意找两个点,求后访问的点与先访问的点点权差的最大值. 思路: 考虑暴力:维护路径的 ...

  2. 2019.01.13 bzoj4538: [Hnoi2016]网络(树链剖分)

    传送门 树链剖分一眼题. 题意简述: 给定一棵树,有三种操作: 加入一条路径 删除一条已加入的路径 询问不过一个点x的路径的最大值. 思路: 直接树链剖分维护答案. 因为询问的事不过点xxx的最大值, ...

  3. 牛客练习赛26 E-树上路径 (树链剖分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/180/E 来源:牛客网 树上路径 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  4. 2019.01.20 bzoj2238: Mst(kruskal+树链剖分)

    传送门 树链剖分菜题. 题意简述:给一个无向图,边有边权,每次询问删一条边(对后面的询问无影响)之后的最小生成树. 思路: 先跑一次kruskalkruskalkruskal并把跑出来的最小生成树给链 ...

  5. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)

    传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...

  6. 2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)

    传送门 题意简述:咕咕咕 思路:考虑预处理出bbb数组,然后每次改动aaa都只会对第iii和i+1i+1i+1这两个位置产生影响,于是可以用线段树来维护bbb数组. 现在求答案的方法是断环为链,倍增整 ...

  7. 2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)

    传送门 题意简述: 给一棵完全二叉树,有点权aia_iai​和边权,每个点有一盏灯,现在要按一定要求点亮: 任意时刻点亮的灯泡必须连通 点亮一个灯泡后必须先点亮其子树 费用计算如下:点第一盏灯不要花费 ...

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

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

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

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

随机推荐

  1. windows,mac os与 linux 3系统共存

    硬盘1,C盘 win7 ,D盘 win7文件,E盘 mac os系统 通过easybcd引导, 选项1 ,window 7 选项2,mac --便捷式/外接存储介质(是一个制作好的专门引导mac的工具 ...

  2. java课程之团队开发冲刺1.1

    一.今日目标 1.完成课程助手的日期显示以及周数显示功能 2.将功能表改成侧面功能栏 3.将代码重新规范,尽量使得主函数简洁明了

  3. margin的垂直方向塌陷

    标签(空格分隔): margin塌陷 margin垂直方向塌陷问题: 如下代码: <!DOCTYPE html> <html lang="en"> < ...

  4. event.keyCode用法及列表

    HTML 用户名:<input type="text" id="UserAccount" onKeyPress="JumpByEnter(Use ...

  5. python的可变对象与不可变对象

    a = 1print(id(a))def fun(a): a = 2 print(a,id(a))fun(a)print(a,id(a)) # 1#为什么这里的a的值没有改变#因为在函数里变量赋值(内 ...

  6. 与python的三天

    #导入海龟图 import turtleturtle.showturtle()turtle.width(20)liebiao = ['red','blue','yellow','green','pur ...

  7. Servlet第三篇(response;request)

    response对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象.和代表响应的response对象 那么我们获取浏览器提交过来的数据,找reque ...

  8. 贝叶斯分类器,随机森林,梯度下载森林,神经网络相关参数的意义和data leakage

    构建的每一颗树的数据都是有放回的随机抽取的(也叫bootstrap),n_estimators参数是你想设置多少颗树,还有就是在进行树的结点分裂的时候,是随机选取一个特征子集,然后找到最佳的分裂标准.

  9. SQL 数据开发(经典)转贴

    数据开发(经典) 1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Str oke_ci_as ...

  10. pwnable.kr-bof-witeup

    根据原程序可知,输入overflowme变量覆盖key变量即可,所以接下来应该看俩变量的距离,从而构造覆盖的payload. 嗯,他们相差了52个地址,overflowme变量在低地址,存放函数的栈中 ...