90pts WA on #7 #9 but vector存图求调
查看原帖
90pts WA on #7 #9 but vector存图求调
782210
Yu_Chengxuan楼主2025/2/7 10:52
#include <bits/stdc++.h>
#define int long long
using namespace std;

inline 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*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
const int N = 1e6 + 10;
int dfn[N],f[N],tot;
int lp[N],siz;
struct node{
	int v,w;
};
vector<node> e[N];
void dfs(int u,int fa,node edge){
    dfn[u]=++tot;
    for (auto x:e[u]){
    	int v=x.v;
    	if (fa==x.v && edge.v==u && x.w==edge.w) continue;
    	if (dfn[v]){
    		if (dfn[u]>dfn[v]){
    			continue;
			}
			lp[++siz]=v;
			for(;v!=u;v=f[v]) lp[++siz]=f[v];
		}
		else{
			f[v]=u;
			dfs(v,u,x);
		}
	}
}
int vis[N],d[N],s[N],ans;
void dp(int u){
    vis[u]=1;
    for(auto x:e[u]){
    	int v=x.v,w=x.w;
        if(vis[v]) continue;
        dp(v);
        ans=max(ans,d[u]+d[v]+w);
        d[u]=max(d[u],d[v]+w);
    }
}
int q[N];
inline int upd(int u){
	return (u>=siz)?u-siz:u;
}
int l,r;
inline int solve(int u){
	siz=0; 
	tot=0;
	dfs(u,-1,{0,-1});
	lp[0]=lp[siz];
	for(int i=1;i<=siz;i++){
		vis[lp[i]]=true;
	}
	int ans1=0,ans2=0;
	for(int i=1;i<=siz;i++){
		ans=0;
		dp(lp[i]);
		ans1=max(ans1,ans);
	}
	if(siz==2){ 
	    for (auto x:e[lp[1]]){
	    	int v=x.v;
	        if(v==lp[2]){
	        	ans2=max(2ll,d[lp[1]]+d[lp[2]]+x.w);
			}
	    }
	    return max(ans1,ans2);
	}
	for(int i=1;i<=siz;i++){
		int w;
		for (auto x:e[lp[i]]){
			int v=x.v;
			if(v==lp[i-1]){
				w=x.w; 
				break;
			}
		}
		s[i]=s[i-1]+w; 
	}
	for(int i=1;i<siz;i++) s[siz+i]=s[siz]+s[i];	 
	l = r = 1; 
	q[1]=0;
	for(int i=1;i<siz*2;i++){	
		while(l<=r && q[l]<=i-siz) l++;
		while(l<=r && s[q[r]]-d[lp[upd(q[r])]]>=s[i]-d[lp[upd(i)]]) r--;
		ans2=max(ans2,d[lp[upd(q[l])]]+d[lp[upd(i)]]+s[i]-s[q[l]]);
		q[++r]=i;
	}
	return max(ans1,ans2); 
}
int n;
signed main(){
	n=read();
	for (int u=1,v,w;u<=n;u++){
		v=read(),w=read();
		e[u].push_back({v,w});
		e[v].push_back({u,w});
	}
	int ret=0;
	for (int i=1;i<=n;i++){
		if (!vis[i]){
			ret+=solve(i);
		}
	}
	cout << ret;
}
2025/2/7 10:52
加载中...