CSP 2020 T2 动物园

实在是出题人良心的馈赠,将为每位选手的oi之路上平添一份助力。

description

solution:

这道题才是真正的签到题,且题目还保证了\(q_i\)互不相同
对于第\(k\)位为1的情况,如果当前的动物中没有这一位为1的,那么这位就必须选0
不妨设有\(cnt\)位是自由的,那么答案就是\(2^{cnt}-n\)
注意开\(unsigned\ long\ long\)以及特判\(2^{64}\)的情况

code:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=70;
ll a;
int n,m,c,k;
bool flag[N];
inline ll read()
{
	ll s=0,w=1; char ch=getchar();
	for(;!isdigit(ch);ch=getchar())if(ch=='-')w=-1;
	for(;isdigit(ch);ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
	return s*w;
}
int main()
{
	scanf("%d%d%d%d",&n,&m,&c,&k);
	for(int i=1;i<=n;++i)
	{
		ll x=read();a|=x;
	}
	for(int i=1;i<=m;++i)
	{
		int p,q;scanf("%d%d",&p,&q);
		if((!((a>>p)&1))&&(!flag[p]))--k,flag[p]=1;
	}
	ll ans=0ull;
	if(k==64)
	{
		if(!n)return puts("18446744073709551616"),0;
		else ans=18446744073709551615ull,--n;
	}
	else ans=1ull<<k;
	cout<<ans-1ull*n<<endl;
	return 0;
}
posted @ 2020-11-09 21:04  BILL666  阅读(89)  评论(0编辑  收藏  举报