NC213855. [CSP2020]动物园(zoo)
描述
输入描述
第一行包含四个以空格分隔的整数 。分别表示动物园中动物数量、《饲养指南》要求数、饲料种数与动物编号的二进制表示位数。
第二行 个以空格分隔的整数,其中第 个整数表示 。
接下来 行,每行两个整数 表示一条要求。
数据保证所有 互不相同,所有的 互不相同。
输出描述
仅一行一个整数表示答案。
示例1
输入:
3 3 5 4 1 4 6 0 3 2 4 2 5
输出:
13
说明:
动物园里饲养了编号为 1、4、6 的三种动物,《饲养指南》上 3 条要求为:
由于在当前动物园中加入一种编号为 0,2,3,5,7,8, ⋯ ,15 之一的动物,购物清单都不会改变,因此答案为 13。
示例2
输入:
2 2 4 3 1 2 1 3 2 4
输出:
2
C++(g++ 7.5.0) 解法, 执行用时: 235ms, 内存消耗: 432K, 提交时间: 2023-08-05 14:04:12
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+5; int n,m,c,k,x,p,q,cnt; bool vis[N]; unsigned long long S,ans; signed main(){ scanf("%lld%lld%lld%lld",&n,&m,&c,&k); if(k==64&&!n) puts("18446744073709551616"),exit(0); for(int i=1;i<=n;i++) scanf("%lld",&x),S|=x; for(int i=1;i<=m;i++){ scanf("%lld%lld",&p,&q); if(((S>>p)&1)==0) vis[p]=1; } for(int i=0;i<k;i++) if(!vis[i]) cnt++; ans=(1ull<<cnt)-n,printf("%llu\n",ans); return 0; }
C++(clang++11) 解法, 执行用时: 683ms, 内存消耗: 21868K, 提交时间: 2021-02-10 16:25:24
#include<bits/stdc++.h> using namespace std; long long n,m,i,c,k,x,p,q,t,s,v[1000001]; int main() { cin>>n>>m>>c>>k; if(k==64&&!n) { puts("18446744073709551616"); return 0; }for(q=n;n--;) cin>>x,s|=x; for(;m--;) { cin>>p>>x; if(!(s>>p&1))v[p]=1; }for(;i<k;i++) if(!v[i])t++; cout<<(1ull<<t)-q; }