- 没有讨厌的人的舞会
厌氧
- @ 2026-5-15 11:30:19
这份代码厌氧,第一个样例吸不吸氧输出都不一样
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=1e6+17;
int n;
int v[N];
int f[N],rd[N];
bool tag[N],isc[N];
struct node{
int nxt,to;
}q[N],p[N];int head[N],cnt;
void add(int x,int y){
q[++cnt]=node{head[x],y};
head[x]=cnt;return;
}
int find(int x){
if(x==f[x]) return x;
return f[x]=find(f[x]);
}
vector<int> pos[N/2];
int tp;
void findCir(int id,int x){
isc[x]=1;
if(x!=pos[id][0]){
pos[id].push_back(x);
}
for(int i=head[x];i;i=q[i].nxt){
int dd=q[i].to;
if(dd==pos[id][0]) return;
findCir(id,dd);
}
}long long dp[N][2];
void dfs(int x,int fa){
dp[x][0]=0;dp[x][1]=v[x];
for(int i=head[x];i;i=q[i].nxt){
int dd=q[i].to;
if(dd==fa||isc[dd]) continue;
dfs(dd,x);
dp[x][0]+=max(dp[dd][0],dp[dd][1]);
dp[x][1]+=(dp[dd][0]);
}
}
long long f1[N][2];
long long dp1(int id){
f1[0][1]=dp[pos[id][0]][1];
f1[0][0]=dp[pos[id][0]][0];
int m=pos[id].size();
for(int i=1;i<m;i++){
f1[i][0]=max(f1[i-1][0],f1[i-1][1])+dp[pos[id][i]][0];
f1[i][1]=f1[i-1][0]+dp[pos[id][i]][1];
if(i==m-1||i==1){
f1[i][1]=0;
}
}return max(f1[m-1][1],f1[m-1][0]);
}
long long dp2(int id){
f1[0][1]=dp[pos[id][0]][0];
f1[0][0]=dp[pos[id][0]][0];
int m=pos[id].size();
for(int i=1;i<m;i++){
f1[i][0]=max(f1[i-1][0],f1[i-1][1])+dp[pos[id][i]][0];
f1[i][1]=f1[i-1][0]+dp[pos[id][i]][1];
}return max(f1[m-1][1],f1[m-1][0]);
}
signed main(){
cin >> n;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=n;i++){
cin >> v[i];
int tmp;cin >> tmp;
add(i,tmp);rd[tmp]++;
p[i]=node{tmp,i};
int fx=find(i),fy=find(tmp);
if(fx!=fy){
f[fx]=fy;
}else if(fx==fy&&!tag[fx]){
isc[i]=1;tag[fx]=1;
pos[++tp].push_back(i);
}
}
for(int i=1;i<=tp;++i){
findCir(i,pos[i][0]);
}for(int i=1;i<=n;++i) add(p[i].nxt,p[i].to);
for(int i=1;i<=n;++i){
if(isc[i]){
dfs(i,0);
}
}
long long ans=0,res;
for(int i=1;i<=tp;++i){
res=max(dp1(i),dp2(i));
ans+=res;
}cout << ans << '\n';
return 0;
}
1 条评论
-
VOID_DC LV 7 @ 2026-5-25 20:18:55
此贴结
- 1
信息
- ID
- 342
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 98
- 已通过
- 16
- 上传者