求调
查看原帖
求调
853187
myzzym楼主2024/10/17 11:02
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
struct Edge{
	int v,next,w;
}e[N<<1];
int head[N],idx;
void add(int u,int v,int w){
	e[++idx]={v,head[u],w};
	head[u]=idx;
}
int n,m,root,dis[N],t[N],sl[N],pm[N],px[N],pn,qz[N],dep[N],f[N][20],g[N][20],cf[N],lst;
bool cmp(int x,int y){
	return sl[x]>sl[y];
}
void fr(int u,int fa){
	if(dis[u]>=dis[root]) root=u;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v,w=e[i].w;
		if(v==fa) continue;
		dis[v]=dis[u]+w;
		fr(v,u);
	}
}
void dfs(int u,int fa){
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v,w=e[i].w;
		if(v==fa) continue;
		cf[v]=cf[u]+w;
		dfs(v,u);
		if(dis[v]+w>dis[u])
			dis[u]=dis[v]+w,t[u]=t[v];
	}
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v,w=e[i].w;
		if(v==fa) continue;
		if(t[v]!=t[u])
			px[++pn]=t[v],sl[t[v]]=dis[v]+w; 
	}
	if(!t[u]) t[u]=u;
}
void dfs_(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa,g[u][0]=pm[t[u]];
	for(int i=1;1<<i<dep[u];i++)
		f[u][i]=f[f[u][i-1]][i-1],g[u][i]=min(g[u][i-1],g[f[u][i-1]][i-1]);
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa) continue;
		dfs_(v,u);
	}
}
int bz(int u,int k){
	for(int i=19;i>=0;i--)
		if(f[u][i]&&g[u][i]>k)
			u=f[u][i];
	return u;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<n;i++){
		int u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		add(u,v,w),add(v,u,w);
	}
	fr(1,0);
	memset(dis,0,sizeof(dis));
	dfs(root,0);
	px[++pn]=t[root],sl[t[root]]=dis[root];
	sort(px+1,px+pn+1,cmp);
	for(int i=1;i<=pn;i++)
		pm[px[i]]=i,qz[i]=qz[i-1]+sl[px[i]];
	dfs_(root,0);
	while(m--){
		int x,y;
		scanf("%lld%lld",&x,&y);
		x=(x+lst-1)%n+1,y=(y+lst-1)%n+1;
		if(pm[t[x]]<2*y) lst=qz[min(pn,2*y-1)];
		else{
			int d1=bz(x,2*y-2),d2=bz(x,2*y-1);
			lst=max(qz[2*y-2]+cf[t[x]]-cf[d1],qz[2*y-1]-dis[d2]+cf[t[x]]-cf[d2]);
		}
		printf("%lld\n",lst);
	}
	
	return 0;
}
2024/10/17 11:02
加载中...