30pts求助
查看原帖
30pts求助
214728
剑雪清寒楼主2022/8/2 17:16

rt;球球

#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=b;i++)
#define nF(i,a,b) for(int i=a;i<b;i++)
#define uF(i,a,b) for(int i=a;i>=b;i--)
#define unF(i,a,b) for(int i=a;i>b;i--)
inline long long read() {
	long long x,f;char ch;
	for(f=0;!isdigit(ch=getchar());f=ch=='-');
	for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
	return f?-x:x;
}
inline void print(long long x,char las) {
	if(!x) {
		putchar('0'),putchar(las);
		return ;
	}
	if(x<0) putchar('-'),x=-x;
	int ls[30],k=0;
	while(x) ls[++k]=x%10,x/=10;
	while(k) putchar(ls[k--]+48);
	putchar(las);
	return ;
}
int rs;
struct edge {
	int to;
	edge *next;
}rd[1000050],*head[1000050];
int n=read();
long long po[1000050];
bitset<1000050>vis;int rt1,rt2;
inline void dfs(int x) {
	vis[x]=1;
	for(edge *i=head[x];i;i=i->next) {
		int nex=i->to;
		if(vis[nex]) {
			rt1=nex;rt2=x;
			continue;
		}
		dfs(nex);
	}
	return ;
}
long long dp[2][1000001];
inline void ddp(int x) {
	dp[1][x]=po[x];dp[0][x]=0;
	for(edge *i=head[x];i;i=i->next) {
		int nex=i->to;
		if(nex==rt1) continue;
		ddp(nex);
		dp[1][x]+=dp[0][nex];
		dp[0][x]+=max(dp[0][nex],dp[1][nex]);
	}
//	printf("%d ; %lld ; %lld\n",x,dp[0][x],dp[1][x]);
	return ;
}
long long ans;
inline void done(int x) {
	dfs(x);
	ddp(rt1);
//	puts("");
	long long k1=dp[0][rt1];
	swap(rt1,rt2);
	ddp(rt1);
//	puts("");
	ans+=max(k1,dp[0][rt1]);
}
int main() {
	F(i,1,n) {
		po[i]=read();int d=read();
		rd[rs].to=i;rd[rs].next=head[d];head[d]=&rd[rs++];
	}
	F(i,1,n) if(!vis[i]) done(i);
	print(ans,'\n');
	return 0;
}

2022/8/2 17:16
加载中...