40pt求救玄关
查看原帖
40pt求救玄关
1018182
ShaunSH楼主2025/7/2 18:21
#include <bits/stdc++.h>
using namespace std;
int n,l,k,rt,fa[1000005],tmp;
long long dp[1000005][2],ans1,ans2,ans;
int r[1000005];
bool vis[1000005]; 
vector<int> sons[1000005];
int find_root(int p){
	while(1){
        if(vis[p])return p;
        vis[p]=1;
        p=fa[p];
    }
}
void dfs(int p){
	vis[p]=1;
	dp[p][0]=0;
	dp[p][1]=r[p];
	for(int i=0;i<sons[p].size();i++){
		dfs(sons[p][i]);
		dp[p][0]+=max(dp[sons[p][i]][0],dp[sons[p][i]][1]);
		dp[p][1]+=dp[sons[p][i]][0];
	}
	return;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&r[i],&fa[i]);
		sons[fa[i]].push_back(i);
	}
	for(int i=1;i<=n;i++){
		if(vis[i])continue;
		vis[i]=1;
		rt=find_root(i);
		tmp=fa[rt];
		fa[rt]=0;
		for(vector<int>::iterator it=sons[tmp].begin();it!=sons[tmp].end();++it){
  	        if(*it==rt){
  	            sons[tmp].erase(it);
  	            break;
        	}
    	}
		dfs(rt);
		ans1=dp[rt][0];
		fa[rt]=tmp;
		sons[tmp].push_back(rt);
		rt=fa[rt];
		tmp=fa[rt];
		fa[rt]=0;
		for(vector<int>::iterator it=sons[tmp].begin();it!=sons[tmp].end();++it){
	        if(*it==rt){
  	            sons[tmp].erase(it);
   	            break;
    	    }
    	}
		dfs(rt);
		ans2=dp[rt][0];
		ans+=max(ans1,ans2);
	}
	printf("%lld",ans);
   	return 0; 
}

找不到40pt的错误

2025/7/2 18:21
加载中...