萌新求助90pts Wa on test 7 9
查看原帖
萌新求助90pts Wa on test 7 9
220342
梦语小猪头楼主2021/11/12 16:51
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 2000017
#define ll long long
using namespace std;

struct Edge{int v,w,next;}e[N];
int n,tot,top,num,cnt,head[N],st[N],dfn[N],cir[N],nxt[N],q[N];
bool b[N],opt[N],vis[N];ll res,ans,dis[N],sum[N],len[N],val[N];

void add(int u,int v,int w) {
	e[++tot].v = v;e[tot].w = w;
	e[tot].next = head[u];head[u] = tot;
}

void dfs1(int u) {
	dfn[u] = ++num;st[++top] = u;opt[u] = 1;
	for(int i = head[u];i;i = e[i].next){
		int v = e[i].v;
		if(b[i])continue;
		if(dfn[v]){
			if(dfn[v] > dfn[u])continue;
			for(int j = top;st[j] != v;j -= 1)vis[st[j]] = 1,cir[++cnt] = st[j];
			vis[v] = 1;cir[++cnt] = v;
		}
		else b[i] = b[i^1] = 1,dfs1(v);
	}
	top--;
}

void dfs2(int u,int f) {
	len[u] = 0;
	for(int i = head[u];i;i = e[i].next){
		int v = e[i].v,w = e[i].w;
		if(v == f || vis[v])continue;
		dfs2(v,u);res = max(res,len[u]+len[v]+w);len[u] = max(len[u],len[v]+w);
	}
}

void solve(int s) {
	cnt = 0;res = 0;dfs1(s);
	for(int i = 1;i <= cnt;i += 1)dfs2(cir[i],0),val[i] = len[cir[i]];
	for(int i = 1;i < cnt;i += 1)nxt[i] = cir[i+1];nxt[cnt] = cir[1];
	for(int i = 1;i <= cnt;i += 1)
		for(int j = head[cir[i]];j;j = e[j].next){
			int v = e[j].v,w = e[j].w;
			if(v == nxt[i]){
				dis[i] = w;
				break;
			}
		}
	for(int i = cnt+1;i <= 2*cnt;i += 1)val[i] = val[i-cnt],dis[i] = dis[i-cnt];
	for(int i = 1;i <= 2*cnt;i += 1)sum[i] = sum[i-1]+dis[i-1];
	int head = 1,tail = 1;q[1] = 1;
	for(int i = 2;i <= 2*cnt;i += 1){
		while(head <= tail && q[head] <= i-cnt)head++;
		res = max(res,val[i]+val[q[head]]+sum[i]-sum[q[head]]);
		while(head <= tail && val[q[tail]]-sum[q[tail]] <= val[i]-sum[i])tail--;
		q[++tail] = i;
	}
	ans += res;
}

int main()
{
	scanf("%d",&n);tot = 1; 
	for(int i = 1,v,w;i <= n;i += 1){
		scanf("%d%d",&v,&w);
		add(i,v,w);add(v,i,w);
	}
	for(int i = 1;i <= n;i += 1)
		if(!opt[i])solve(i);
	printf("%lld\n",ans);
	return 0;
 } 
2021/11/12 16:51
加载中...