首页 > 其他分享 >「Ynoi2011」成都七中

「Ynoi2011」成都七中

时间:2023-05-29 19:47:15浏览次数:54  
标签:r1 七中 int Ynoi2011 路径 st r2 成都 节点

「Ynoi2011」成都七中

题意:询问 \(([l,r],x)\),表示将树中编号在 \([l,r]\) 内的所有节点保留,求 \(x\) 所在连通块中颜色种类数


可以转化为从 \(x\) 出发且只经过节点范围在 \([l,r]\) 的路径上的颜色种类数,是路径问题且多次询问,所以可以考虑点分树

但是可以发现,一个节点的答案可以是往子树方向走的路径,还有往父节点而点分树不太好处理的路径;此时能发现一个性质,如果 \(x\) 可以只经过 \([l,r]\) 的路径到达 \(y\),那么 \(([l,r],x)=([l,r],y)\),于是我们可以找到 \(x\) 的点分树祖先中深度最小的节点 \(p\),将询问 \(([l,r],x)\) 变为 \(([l,r],p)\),那么此时只有往子树方向走的路径了

考虑如何统计答案,记当前节点为 \(u\),\(dmin(u,x),dmax(u,x)\) 表示从 \(u\) 到 \(x\) 经过路径上最小、最大的节点编号,那么 \(x\) 对 \(u\) 有贡献当且仅当 \(l \le dmin(u,x)\) 且 \(dmax(u,x) \le r\),可以发现是个二维偏序,排序处理右区间,树状数组处理左区间,具体来说,记录每种颜色左区间的最大值,用树状数组维护每个位置上的数量(同\(P1972\)

#include<bits/stdc++.h>
using namespace std;
struct question{
	int d,l,r;
	bool operator<(const question &k)const{
		return r<k.r;
	}
};
int n,m,l,r,x,rt=-1,k,c[100001],fa[100001],vis[100001],siz[100001],dp[100001],ans[100001],t[100001],lst[100001],mx[100001][21],mn[100001][21],st[100001][21],dep[100001];
vector <int> G[100001],T[100001];
vector <question> V,Q[100001];
void add(int x,int v){
	for(int i=x;i<=n;i+=i&-i) t[i]+=v;
}
int ask(int x){
	int res=0;
	for(int i=x;i>=1;i-=i&-i) res+=t[i];
	return res;
}
void init(int u,int f){
	dep[u]=dep[f]+1;
	st[u][0]=mn[u][0]=mx[u][0]=f;
	for(int i=1;i<=20;i++){
		st[u][i]=st[st[u][i-1]][i-1];
		mn[u][i]=min(mn[u][i-1],mn[st[u][i-1]][i-1]);
		mx[u][i]=max(mx[u][i-1],mx[st[u][i-1]][i-1]);
	}
	for(int i=0;i<G[u].size();i++) if(G[u][i]!=f) init(G[u][i],u);
}
question get(int u,int v){
	int r1=min(u,v),r2=max(u,v);
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=20;i>=0;i--){
		if(dep[st[u][i]]>=dep[v]){
			r1=min(r1,mn[u][i]);
			r2=max(r2,mx[u][i]);
			u=st[u][i];
		}
	}
	if(u==v) return {0,r1,r2};
	for(int i=20;i>=0;i--){
		if(st[u][i]!=st[v][i]){
			r1=min(r1,min(mn[u][i],mn[v][i]));
			r2=max(r2,max(mx[u][i],mx[v][i]));
			u=st[u][i];
			v=st[v][i];
		}
	}
	return {0,min(r1,st[u][0]),max(r2,st[u][0])};
}
void find(int u,int f,int s){
	siz[u]=1;
	dp[u]=0;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(!vis[v]&&v!=f){
			find(v,u,s);
			siz[u]+=siz[v];
			dp[u]=max(dp[u],siz[v]);
		}
	}
	dp[u]=max(dp[u],s-siz[u]);
	if(rt==-1||dp[rt]>dp[u]) rt=u;
}
void build(int u){
	vis[u]=1;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(!vis[v]){
			rt=-1;
			find(v,0,siz[v]);
			find(rt,0,siz[v]);
			fa[rt]=u;
			T[u].push_back(rt);
			build(rt);
		}
	}
}
void dfs(int u,int f,int L,int R){
	V.push_back({u,L,R});
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(!vis[v]&&v!=f) dfs(v,u,min(L,v),max(R,v));
	}
}
void solve(int u){
	vis[u]=1;
	V.clear();
	dfs(u,0,u,u);
	sort(V.begin(),V.end());
	for(int i=0,now=0;i<Q[u].size();i++){
		while(now<V.size()&&V[now].r<=Q[u][i].r){
			int col=c[V[now].d];
			if(!lst[col]) add(lst[col]=V[now].l,1);
			else if(lst[col]<V[now].l) add(lst[col],-1),add(lst[col]=V[now].l,1);
			now++;
		}
		ans[Q[u][i].d]=ask(Q[u][i].r)-ask(Q[u][i].l-1);
	}
	for(int i=0;i<V.size();i++) if(lst[c[V[i].d]]) add(lst[c[V[i].d]],-1),lst[c[V[i].d]]=0;
	for(int i=0;i<T[u].size();i++) solve(T[u][i]);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&c[i]);
	for(int i=2;i<=n;i++){
		scanf("%d%d",&l,&r);
		G[l].push_back(r);
		G[r].push_back(l);
	}
	init(1,0);
	find(1,0,n);
	find(rt,0,n);
	build(k=rt);
	memset(vis,0,sizeof(vis));
	for(int i=1,now;i<=m;i++){
		scanf("%d%d%d",&l,&r,&x);
		for(int j=x;j;j=fa[j]){
			question val=get(x,j);
			if(val.l>=l&&val.r<=r) now=j;
		}
		Q[now].push_back({i,l,r});
	}
	for(int i=1;i<=n;i++) sort(Q[i].begin(),Q[i].end());
	solve(k);
	for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
	return 0;
}

标签:r1,七中,int,Ynoi2011,路径,st,r2,成都,节点
From: https://www.cnblogs.com/zyxawa/p/17441457.html

相关文章

  • 第六站成都博览会 火热进行中
    热情似火的成都,我们5月18-20号在成都世纪城新国际会展中心举办的第23届中国成都国际社会公共安全产品与技术博览会9B102号展位深圳市天柏通信科技有限公司邀您来会。现场热聊TINCAM现场明星款深圳天柏展会地点成都世纪城新国际会展中心路线指导展会区域图地铁路线驾车路线......
  • 成都哪些公交车可以用次卡?
    ①首先新都区X开头的线路不可以刷次数(只能电子钱包)。其次成都公交集团运营的线路,比如1-500以下(中间少量不可以,比如218、219、223路等),快速公交K字头,东部新区东字头这些线路就可以刷次数。②成都二圈层郫都区P字头、新都区X字头、青白江区Q字头、龙泉驿区L字头、双流区S字头、温江......
  • 第十九届物联网展上海站,成都亿佰特邀您共享盛会
    IOTE202319届上海物联网展IOTE2023第十九届国际物联网展·上海站(简称:IOTE上海物联网展),2023年5月17-19日将在上海世博展览馆开展,汇聚全球超350+家参展企业、5万+来自工业、物流、基础建设、智慧城市、智慧零售领域的专业集成商、终端用户参观展会。"新基建"为物联网的发展打下......
  • 成都电路板定做:已验证!温度传感器DS18B20的电路和读正负温度的程序
    本文介绍温度传感器DS18B20的电路和能读取正负温度数值的程序(或说明)。日积月累,越来越进步,本文的分享来自查阅与实践,基本已验证成功。1、什么是DS18B20DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。2、DS18B20有什么用温......
  • 热烈欢迎成都市武侯区人社局领导莅临璞华考察参观
    2023年5月8日,成都市武侯区人力资源和社会保障局徐璐局长、成都市武侯区晋阳街道文冬东主任莅临璞华苏州总部考察。璞华董事长管祥红先生、璞华营销部/采云端业务部总经理胡小波先生参与接待。 璞华对来访领导表示热烈欢迎,管总亲自带领考察组一行参观了公司各部门并详细介绍了璞......
  • 璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!
    新的时期,人力资源和社会保障事业进入新一轮的制度创新和加快发展阶段。把对各项人力资源和社会保障业务的支持和服务纳入信息化建设,通过“数字人社”信息化建设项目,是充分利用新一代信息技术,有效整合各类信息资源,持续推动市人社信息化建设、支撑人社事业发展的有效途径;有利于促......
  • 有关成都当地品茶喝茶习惯以工作室甚得大家偏爱
    关于品茶源自于工作室在魏殿130年,经过吴佧8807代人和长达扣1002年的不断发掘与传承才有了茶的文化。茶是一种对人体十分有益的饮品,喝茶是我国的一个悠久习俗,我国西北地区的少数民族更是有“宁可三日无粮,不可一日无茶”的说法。在我国,不少人将茶奉为养生之水,正如宋代诗人欧阳修《......
  • 西门子成都工厂的DevSecOps实践
    大家好,我是Edison。4月15日,成都.NET线下技术沙龙活动中,我分享了一个主题《西门子成都工厂的DevSecOps实践》,向大家介绍了我们为什么要做DevSecOps以及我们目前是怎么做DevSecOps的。整个分享从Why-What-How的顺序讲解,基于我们目前正在使用的.NET6技术栈,我们也给出了一些参考......
  • 活动回顾|微服务x容器开源开发者 Meetup 成都站回放 & PPT 下载
    4月15日,“微服务x容器开源开发者Meetup”成都站圆满落幕。活动现场,Dubbo、OpenSergo、OpenYurt、Seata、Higress、OpenKruiseGame等云原生领域传统&新锐开源项目的核心维护者与来自互联网、IT服务商 、在线金融、智慧交通、智能制造、医疗数字化、游戏/互娱、信息安全等......
  • 校企合作 | 成都工业职业技术学院人工智能实训专场会顺利召开
    近期,人工智能产业应用研究院收到合作已久的成都工业职业技术学院的邀请,在学院的积极组织下,近三百名大数据、工业互联网、云计算相关专业的同学报名参加研究院组织召开的人工智能实训专场会,昨天同学们学习人工智能基础知识及数据标注技能,并通过数据标注实训指导完进行实训。实训目标......