传送门

题意简述:

给一棵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. SQL中NVL函数

    空值判断函数 1.NVL(表达式A,表达式B) 如果表达式A为空值,NVL返回值为表达式B的值,否则返回表达式A的值.该函数的目的是把一个空值(null)转换成一个实际的值.其表达式的值可以是数字型. ...

  2. MySQL 还原

    ## sql 还原:mysql -default-character-set=utf8 -h127.0.0.1 -uroot -pxxxxxx test2 < /data/test/db/201 ...

  3. git 新建仓库

    rm -rf .git git init git add . git commit -m "Initial commit" git remote add origin <gi ...

  4. 交叉熵理解:softmax_cross_entropy,binary_cross_entropy,sigmoid_cross_entropy简介

    cross entropy 交叉熵的概念网上一大堆了,具体问度娘,这里主要介绍深度学习中,使用交叉熵作为类别分类. 1.二元交叉熵 binary_cross_entropy 我们通常见的交叉熵是二元交 ...

  5. SpringCloud-day08-Hystrix断路器

    8.Hystrix断路器 8.1.Hystrix简介 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互. Hys ...

  6. Python数据分析学习(一):Numpy与纯Python计算向量加法速度比较

    import sys from datetime import datetime import numpy as np def numpysum(n): a = np.arange(n) ** 2 b ...

  7. js 一键复制

    function copyURL(id){ var siteId=$("#siteId").val() var oInput = document.createElement('i ...

  8. idea激活方式

    idea破解方法:转自https://note.youdao.com/ynoteshare1/index.html?id=d0f3fb42bfa1bb65a33115a1b6140f5f&ty ...

  9. 20175314 《Java程序设计》第七周学习总结

    20175314 <Java程序设计>第七周学习总结 教材学习内容总结 第八章:常用实用类 String()类代表字符串:Java 程序中的所有字符串字面值(如 "abc&quo ...

  10. 大数据下基于Tensorflow框架的深度学习示例教程

    近几年,信息时代的快速发展产生了海量数据,诞生了无数前沿的大数据技术与应用.在当今大数据时代的产业界,商业决策日益基于数据的分析作出.当数据膨胀到一定规模时,基于机器学习对海量复杂数据的分析更能产生较 ...