CSP-2020 T2动物园 题解
动物园(zoo)
感觉不算太难(毕竟我这种蒟蒻都能找到一些门道)
考场上自己打的代码还是比较复杂的,效率也不是太高,复盘时还存在一个TLE
另外,又少考虑一种极度极端的情况,就比较崩溃
好下来我们来看看这道题这个题
首先,我们可以列出来所有在已知饲料清单的情况下,动物园内可以有的所有动物
然后减去动物园内已有的动物即可得出答案
那么怎么列举所有的动物呢?
对于第i位,当且仅当它所对应的饲料没有买上时,这一位不能为1;
否则,这一位便有两种存在情况:1||0;
因此,我们只需要再读入饲养守则时看一下:
对于某条守则:第p位对应饲料q
如果任意动物的第p位为1,此时无操作
反之,若任意动物的第p位都为0,那么在统计总数是这一位就不能统计
因此,我们只需要看一下对于所有动物来说,第i位上是否都为0,并记录下来即可;
然后,在读入《饲养守则》时,按照如上规则判断一下即可
值得一说的是,为了防止TLE,可以用‘|’运算来集中判断第i位上是否都为0;(我就被卡着了)
另外注意,2^64是会爆ull(unsigned long long)的,所以最后还得判断一下(会用其他变量类型的大佬自动忽略)
不开ull见祖宗
`
#include<bits/stdc++.h>
using namespace std;
long long n,m,c,k;
const int maxn=100001000;
bool v[maxn],v1[maxn],sl[maxn];
int main()
{
cin>>n>>m>>c>>k;
//memset(v1,true,sizeof(v1));
memset(sl,true,sizeof(sl));
bool flag;
unsigned long long u1;
for(int i=1;i<=n;i++)
{
unsigned long long a1;
cin>>a1;
u1|=a1;
}
for(int i=0;i<k;i++)
{
if(u1%2)v[i]=true;
u1=u1>>1;
}
for(int i=1;i<=m;i++)
{
long long p,q;
cin>>p>>q;
if(v[p])v1[q]=true;
else sl[p]=false;
}
unsigned long long a=1;
for(int i=0;i<k;i++)
{
if(sl[i])a=a<<1;
//cerr<<'a'<<a<<'\n';
}
a-=(unsigned long long)n;
if(a || n)cout<<a;
else cout<<(a-1)/10<<(a-1)%10+1;
}
`

浙公网安备 33010602011771号