关于考试时想到的解法和正解不搭边
  • 板块学术版
  • 楼主xi_11
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/10/11 11:57
  • 上次更新2023/10/27 07:54:56
查看原帖
关于考试时想到的解法和正解不搭边
676490
xi_11楼主2022/10/11 11:57

喵喵喵幼儿园里有 n 只喵喵,分别编号 1∼n。每只喵喵有一个可爱值 c[i],但每只喵喵有且仅有一只讨厌的喵喵。由于每只喵喵都很自恋,所以每只喵喵讨厌的喵喵不会是它自己。

这天园长 Rin 想找出一些喵喵来组成喵喵队列,她想要喵喵队列的可爱值最大,但一只喵喵不可以和它讨厌的喵喵一同在队伍里。

喵喵队列的可爱值定义为这个队列里所有喵喵的可爱值之和。

#include<bits/stdc++.h>
using namespace std;
const int M=1e6+10;
long long ans[M],sum;
struct ttt{
	int x,y;
	int val;
}t[M];
int fa[M],n,b[M],mmm[M];
bool cmp(ttt a,ttt b){
	return a.val>b.val;
}
inline get(int x){
	if(fa[x]==x) return x;
	else return fa[x]=get(fa[x]);
}
inline merge(int x,int y){
	if(rand()%2)
	fa[get(x)]=get(y);
	else fa[get(y)]=get(x);
}
int main(){

	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		fa[i]=i;
		b[i]=0;
	}
        for(int i=1;i<=n;i++){
		int a,b;
	scanf("%d%d",&mmm[i],&t[i].y);
		t[i].x=i;
		t[i].val=mmm[i];
	}
	sort(t+1,t+1+n,cmp);
	for(int i=1;i<=n;i++){
		int f1=get(t[i].x);
		int f2=get(t[i].y);
		if(f1==f2){
		continue;
	}
    if(b[t[i].x]==0) b[t[i].x]=t[i].y;
    else{
	  merge(b[t[i].x],t[i].y);
		}
    if(b[t[i].y]==0) b[t[i].y]=t[i].x;
    else{
	  merge(b[t[i].y],t[i].x);
		}
	}
	for(int i=1;i<=n;i++){
	     int f=get(i);
	     ans[f]+=mmm[i];
	}
	for(int i=1;i<=n;i++) sum=max(sum,ans[i]);
	printf("%lld",sum);
}

正解给的是基环树上DP,那我用并查集(跟关押罪犯似的)写,哪里会出锅啊QwQ

2022/10/11 11:57
加载中...