ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3241 [HNOI2015]开店 题解

2022-05-11 19:02:30  阅读:158  来源: 互联网

标签:std dep begin ch int 题解 fa HNOI2015 P3241


题面

这个题没有修改操作,所以不需要开线段树。跟平常的动态点分治做法一样,每个点开两个 vector 按照 \(x_i\) 排序存储到这个点和到这个点在点分树父亲的距离。每次找一个点的时候,暴力跳点分树父亲,直接在 vector 上二分查找满足 \([l,r]\) 这个区间的点和距离,直接计算即可。

点击查看代码
const int N=1.5e5+13,logN=21;
struct Edge{int v,w,nxt;}e[N<<1];
int n,m,q,a[N],h[N],etot;
int siz[N],maxx[N],rt,psum,fa[N],dep[N];
ll dis[N][logN];
bool vis[N];
std::vector<pii> d[N],ch[N];
std::vector<ll> sd[N],sch[N];
inline void add_edge(int u,int v,int w){e[++etot]=(Edge){v,w,h[u]};h[u]=etot;}

namespace Tree{
int fa[N],dep[N],siz[N],son[N],top[N];ll dis[N];
void dfs1(int u,int f,int deep){
	dep[u]=deep,siz[u]=1,fa[u]=f;
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;if(v==f) continue;
		dis[v]=dis[u]+e[i].w;
		dfs1(v,u,deep+1);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
}
void dfs2(int u,int topf){
	top[u]=topf;
	if(!son[u]) return;
	dfs2(son[u],topf);
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
	}
}
inline void init(){dfs1(1,0,0);dfs2(1,1);}
inline int lca(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		u=fa[top[u]];
	}
	return dep[u]<dep[v]?u:v;
}
inline ll dist(int u,int v){return dis[u]+dis[v]-2*dis[lca(u,v)];}
}

void findrt(int u,int f){
	siz[u]=1,maxx[u]=0;
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;if(v==f||vis[v]) continue;
		findrt(v,u);
		siz[u]+=siz[v];
		maxx[u]=max(maxx[u],siz[v]);
	}
	maxx[u]=max(maxx[u],psum-siz[u]);
	if(maxx[u]<maxx[rt]) rt=u;
}
void dfs(int u,int f,ll dis,int g1,int g2){
	d[g1].pb(mp(a[u],dis)),ch[g2].pb(mp(a[u],dis));
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v!=f&&!vis[v]) dfs(v,u,dis+e[i].w,g1,g2);
	}
}
void build(int u){
	vis[u]=1;
	ch[u].pb(mp(a[u],0));
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;if(vis[v]) continue;
		rt=0,psum=siz[v];
		findrt(v,0),findrt(rt,0);
		fa[rt]=u,dep[rt]=dep[u]+1;
		dfs(v,0,e[i].w,rt,u);
		build(rt);
	}
	std::sort(ch[u].begin(),ch[u].end());
	std::sort(d[u].begin(),d[u].end());
//	printf("debug:%d\n",u);
//	for(auto v:ch[u]) printf("age=%d dis=%lld\n",v.fi,v.se);
//	printf("\n");
	ll now=0;
	for(int j=0,lim=ch[u].size();j<lim;++j) now+=ch[u][j].se,sch[u].pb(now);
	now=0;
	for(int j=0,lim=d[u].size();j<lim;++j) now+=d[u][j].se,sd[u].pb(now);
}
int main(){
	read(n),read(q),read(m);
	for(int i=1;i<=n;++i) read(a[i]);
	for(int i=1;i<n;++i){
		int u,v,w;read(u),read(v),read(w);
		add_edge(u,v,w),add_edge(v,u,w);
	}
	maxx[rt=0]=INF,psum=n;
	findrt(1,0),findrt(rt,0);
	build(rt);
	Tree::init();
	for(int i=1;i<=n;++i)
		for(int j=fa[i];j;j=fa[j]) dis[i][dep[i]-dep[j]]=Tree::dist(i,j);
	ll lastans=0;
	while(q--){
		int x,l,r;read(x),read(l),read(r);
		l=(l+lastans)%m,r=(r+lastans)%m;if(l>r) swap(l,r);pii tmpl=mp(l,-LLINF),tmpr=mp(r,LLINF);
		int L=std::lower_bound(ch[x].begin(),ch[x].end(),tmpl)-ch[x].begin();
		int R=std::lower_bound(ch[x].begin(),ch[x].end(),tmpr)-ch[x].begin()-1;
		ll ans=0;
		if(R>=0) ans=sch[x][R]-(L>0?sch[x][L-1]:0);
		for(int u=x;fa[u];u=fa[u]){
			L=std::lower_bound(ch[fa[u]].begin(),ch[fa[u]].end(),tmpl)-ch[fa[u]].begin();
			R=std::lower_bound(ch[fa[u]].begin(),ch[fa[u]].end(),tmpr)-ch[fa[u]].begin()-1;
			if(R>=0) ans+=sch[fa[u]][R]-(L>0?sch[fa[u]][L-1]:0)+(R-L+1)*dis[x][dep[x]-dep[fa[u]]];
			L=std::lower_bound(d[u].begin(),d[u].end(),tmpl)-d[u].begin();
			R=std::lower_bound(d[u].begin(),d[u].end(),tmpr)-d[u].begin()-1;
			if(R>=0) ans-=sd[u][R]-(L>0?sd[u][L-1]:0)+(R-L+1)*dis[x][dep[x]-dep[fa[u]]];
		}
		println(lastans=ans);
	}
	return 0;
}

标签:std,dep,begin,ch,int,题解,fa,HNOI2015,P3241
来源: https://www.cnblogs.com/winterfrost/p/p3241-solution.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有