第13个点求助
查看原帖
第13个点求助
65942
一珂松果楼主2020/11/8 22:22

试了极限数据也没问题,80分不知道怎么错的,下不了数据了,请求第13个点数据,下面是本蒟蒻的80分代码,可能写得不太正常,请见谅

#include<bits/stdc++.h>
using namespace std;
unsigned long long read()
{
	unsigned long long x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		//if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x;
}
unsigned long long ksm(unsigned long long x,unsigned long long y)
{
	unsigned long long sum=1;
	while(y)
	{
		if(y&1) sum=sum*x;
		x=x*x;
		y>>=1;
	}
	return sum;
}
unsigned long long n,m,c,k,p,q;
unsigned long long a[1000006],cnt; 
bool vis[65],used[65],flag;
unsigned long long ans;
string s;
int main()
{
	//freopen("zoo.in","r",stdin);
	//freopen("zoo.out","w",stdout);
	s="18446744073709551616";
	n=read();
	m=read();
	c=read();
	k=read();
	for(int i=1;i<=n;i++) 
	{
		a[i]=read();
		for(int j=0;j<k;j++)
		{
			if(a[i]&(unsigned long long)(1<<j)) vis[j]=1;
		}
	}
	while(m--)
	{
		p=read();
		q=read();
		used[p]=1;
		//if(!vis[p]) cnt++;
	}
	for(int i=0;i<k;i++) if(used[i]&&!vis[i]) cnt++;
	if(k-cnt==64)
	{
	//	cout<<s<<endl;
	//	return 0;
		flag=1;
		ans=ksm(2,63);
	}
	else ans=ksm(2,k-cnt);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<k;j++)
		{
			if(a[i]==0)
			{
				ans--;
				break;
			}
			if(used[j]&&!vis[j])  continue;
			if(a[i]&(unsigned long long)(1<<j)) 
			{
				ans--;
				break;
			}	
		}
	}
	if(flag&&ans==ksm(2,63)) cout<<s<<endl;
	else printf("%llu\n",ans);
	return 0;
}
2020/11/8 22:22
加载中...