萌新刚学基环树5pts求助
查看原帖
萌新刚学基环树5pts求助
735763
_ChongYun_楼主2024/9/28 17:30
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
struct node{
    int to,nxt,val;
}w[2000005];
int h[2000005],cntt=0;
void Link(int x,int y,int val){
    ++cntt;
    w[cntt].to=y;
    w[cntt].nxt=h[x];
    w[cntt].val=val;
    h[x]=cntt;
    return ;
}
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int help[2000005],qwq[2000005],cnt=0;
int vis[2000005],flag[2000005];
int firdfs(int x,int lst){
	if(vis[x]){
		vis[x]=2;
		help[++cnt]=x;
		flag[x]=1;
		return 1;
	}
	vis[x]=1;
	for(int i=h[x];i!=0;i=w[i].nxt){
		int y=w[i].to;
		if(!firdfs(y,i)) continue;
		if(i==((lst-1)^1)+1) continue;
		if(vis[x]!=2){
			help[++cnt]=x;
			flag[x]=1;
			qwq[cnt]=qwq[cnt-1]+w[i].val;
		}
		else{
			qwq[0]=qwq[1]-w[i].val;
			return 0;
		}
		return 1;
	}
	return 0;
}
int maxx=0,dis[2000005],dp[2000005];
void secdfs(int x){
	flag[x]=1;
	for(int i=h[x];i!=0;i=w[i].nxt){
		int y=w[i].to;
		if(flag[y]) continue; 
		secdfs(y);
		maxx=max(maxx,dis[x]+dis[y]+w[i].val);
		dis[x]=max(dis[x],dis[y]+w[i].val);
	}
	return ;
}
deque<int> q;
int work(int rt){
	for(int i=0;i<=2*cnt;i++){
		dp[i]=0; dis[i]=0;
		help[i]=0; qwq[i]=0;
	}
	cnt=0;
	int ans0=0,ans1=0;
	firdfs(rt,0);
	for(int i=1;i<=cnt;i++){
		maxx=0; secdfs(help[i]);
		ans0=max(ans0,maxx);
		dp[i]=dp[i+cnt]=dis[help[i]];
		qwq[i+cnt]=qwq[i+cnt-1]+qwq[i]-qwq[i-1];
	}
	while(!q.empty()) q.pop_front();
	for(int i=1;i<=2*cnt;i++){
		while(!q.empty()&&q.front()<=i-cnt) q.pop_front();
		if(!q.empty()) ans1=max(ans1,dp[i]+dp[q.front()]+qwq[i]-qwq[q.front()]);
		while(!q.empty()&&dp[q.back()]-qwq[q.back()]<=dp[i]-qwq[i]) q.pop_back();
		q.push_front(i);
	}
	return max(ans0,ans1);
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		int u,val;
		u=read(); val=read();
		Link(i,u,val);
		Link(u,i,val);
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(!flag[i]) ans+=work(i);
	}
	printf("%lld\n",ans);
    return 0;
}
2024/9/28 17:30
加载中...