关于Goodbye 2020 F
  • 板块学术版
  • 楼主cunzai_zsy0531kkksd12
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/12/31 01:55
  • 上次更新2023/11/5 05:28:35
查看原帖
关于Goodbye 2020 F
160484
cunzai_zsy0531kkksd12楼主2020/12/31 01:55
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+13;
const ll p=1e9+7;
struct edge{
	int u,v,k;
	bool operator <(const edge &a)const{
		if(u==a.u) return v<a.v;
		return u<a.u; 
	}
}E[N];
int n,m,Tot,top,Fa[N],siz[N],ans[N];
bool state[N],have[N],vis[N];
int Find(int x){return Fa[x]==x?x:Fa[x]=Find(Fa[x]);}
inline void merge(int ki,int u,int v){
	int x=Find(u),y=Find(v);
	if(x!=y&&(!state[x]||!state[y])) Fa[x]=y,siz[y]+=siz[x],state[y]|=state[x];
	else vis[ki]=1;
}
inline ll quick(ll a,int k){
	ll s=1;
	while(k){
		if(k&1) s=s*a%p;
		a=a*a%p;
		k>>=1;
	}
	return s;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,op,u,v;i<=n;++i){
		scanf("%d",&op);
		if(op==1){
			scanf("%d",&u);
			state[u]=1,have[u]=1;
			ans[++top]=i;
		}
		else{
			scanf("%d%d",&u,&v);have[u]=have[v]=1;
			if(u>v) swap(u,v);
			E[++Tot]=(edge){u,v,i};
		}
	}
	sort(E+1,E+Tot+1);
	for(int i=1;i<=m;++i) Fa[i]=i,siz[i]=1;
	for(int i=1;i<=Tot;++i) merge(i,E[i].u,E[i].v);
	ll res1=1;
	for(int i=1;i<=m;++i)
		if(have[i]&&Fa[i]==i){
			if(!state[i]) res1=res1*quick(2,siz[i]-1)%p;
			else res1=res1*quick(2,siz[i])%p;
		}
	for(int i=1;i<=Tot;++i)
		if(!vis[i]) ans[++top]=E[i].k;
	printf("%lld %d\n",res1,top);
	sort(ans+1,ans+top+1);
	for(int i=1;i<=top;++i) printf("%d ",ans[i]);
	return 0;
}

一直WA on test7,求大佬查错……

是不是算法假了?如果是,请问哪个地方假了?

感激不尽!

2020/12/31 01:55
加载中...