P4381 [IOI2008] Island

发布时间 2023-04-24 20:34:25作者: basicecho

P4381 [IOI2008] Island

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int M=1e6+5;

int n;
int h[M],ne[M<<1],e[M<<1],w[M<<1],tot=1;
int a[M<<1],sum[M<<1],cnt;
bool vis[M<<1],st[M<<1];

void add(int from,int to,int wi) {
	e[++tot]=to; w[tot]=wi; ne[tot]=h[from]; h[from]=tot;
}

bool dfs1(int now,int fa) {
	if(vis[now]) {
		st[now]=1;
		a[++cnt]=now;
		return 1;
	}
	vis[now]=1;
	for(int i=h[now];i;i=ne[i]) {
		if((i^1)==fa)continue;
		if(dfs1(e[i],i)) {
			if(st[now]==0) {
				st[now]=1;
				a[++cnt]=now;
				sum[cnt]=w[i];
				return 1;
			}
			else {
				sum[1]=w[i];
				return 0;
			}
		}
	}
	return 0;
}


int dep[M],dis;
void dfs2(int now,int fa) {
	vis[now]=1;
	for(int i=h[now];i;i=ne[i]) {
		int to=e[i];
		if(to==fa||st[to])continue;
		dfs2(to,now);
		dis=max(dis,dep[to]+w[i]+dep[now]);
		dep[now]=max(dep[to]+w[i],dep[now]);
	}
}

int f[M<<1];
int fun(int root) {
	cnt=dis=0;
	dfs1(root,0);
//	for(int i=1;i<=cnt;i++)cout<<sum[i]<<' ';cout<<endl;
	for(int i=1;i<=cnt;i++)sum[i]=sum[i-1]+sum[i];
	for(int i=1,j=cnt+1;i<=cnt;i++,j++)sum[j]=sum[j-1]+(sum[i]-sum[i-1]);
	for(int i=1;i<=cnt;i++) {
		dfs2(a[i],0);
		f[i]=f[i+cnt]=dep[a[i]];
	}
	
//	for(int i=1;i<=2*cnt;i++)cout<<sum[i]<<' ';cout<<endl;
	
	deque<int>q;
	for(int i=1;i<=2*cnt;i++) {
		while(!q.empty()&&q.front()+cnt<=i)q.pop_front();
		if(!q.empty())dis=max(dis,sum[i]-sum[q.front()]+f[i]+f[q.front()]);
		while(!q.empty()&&f[i]-sum[i]>=f[q.back()]-sum[q.back()])q.pop_back();
//		cout<<i<<' '<<q.size()<<endl;
		q.push_back(i);
	}
//	cout<<dis<<endl;
	return dis;
}

void solve() {
	cin>>n;
	for(int i=1;i<=n;i++) {
		int x,wi;
		cin>>x>>wi;
		add(i,x,wi);
		add(x,i,wi);
	}
	int ans=0;
	for(int i=1;i<=n;i++) {
		if(!vis[i])ans+=fun(i);
	}
	cout<<ans<<endl;
}

signed main() {
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	solve();
	return 0;
}