RE+MLE 求助
查看原帖
RE+MLE 求助
220362
chenxuanting楼主2020/11/1 20:43
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef unsigned long long ll;//你开longlong了吗?
int n;
int a[1000005],opt[1000005];
vector<int> link[1000005];
int vis[1000005];
int num,tru,siz,flag=1,maxn;
ll mod=998244353;
ll ans=2;
void muti(int x)
{
	x-=1;
	while(x){
		ans*=ans;
		ans%=mod;
		if(x%2==1){
			ans*=2;
		    ans%=mod;
		}
		x/=2;
	}
}
void dfs(int x,int tf)
{
	if(flag==0){
		return;
	}
	if(tf==0){
		tru++;
	}
	siz++;
	for(int i=0;i<link[x].size();i++){
		if(link[x][i]<0){
			if((vis[link[x][i]*-1]<0&&tf==0)||(vis[link[x][i]*-1]>0&&tf==1)){
				flag=0;
				return;
			}
			if(vis[link[x][i]*-1]==0){
				if(tf==0){
					vis[link[x][i]]=-1;
				}else{
					vis[link[x][i]]=1;
				}
				dfs(link[x][i]*-1,!tf);
			}
		}else{
			if((vis[link[x][i]*-1]<0&&tf==1)||(vis[link[x][i]*-1]>0&&tf==0)){
				flag=0;
				return;
			}
			if(vis[link[x][i]]==0){
				if(tf==0){
					vis[link[x][i]]=1;
				}else{
					vis[link[x][i]]=-1;
				}
				dfs(link[x][i],tf);
			}
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>opt[i];
		if(opt[i]==1){
			link[i].push_back(a[i]);
			link[a[i]].push_back(i);
		}else{
			link[i].push_back(-1*a[i]);
		    link[a[i]].push_back(-1*i);
		}
	}
	for(int i=1;i<=n;i++){
		if(vis[i]==0){
			siz=0;
			tru=0;
			num++;
			dfs(i,0);
			if(flag==0){
				cout<<"No answer";
				return 0;
			}else{
				maxn+=max(siz-tru,tru);
			}
		}
	}
	muti(num);
	cout<<ans<<endl;
	cout<<max(maxn,n-maxn)<<endl;
	cout<<min(maxn,n-maxn);
    return 0;
}
2020/11/1 20:43
加载中...