1 条题解

  • 0
    @ 2025-8-24 22:26:26

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Alex_Wei
    **

    搬运于2025-08-24 22:26:26,当前版本为作者最后更新于2020-11-11 18:46:42,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    upd on 2020.11.17:修正一个错误。

    题目传送门

    先开一个数组 bucjbuc_j 表示是否有 aia_i 的第 jj 位上是 11

    又看到题目中保证 qiq_i 互不相同,所以一旦出现 pi,qip_i,q_i 满足 bucpi=0buc_{p_i}=0,那么这一位就不能选,因为当前买的饲料中必定没有 qiq_i

    不妨设剩下来 bitbit 位,那么这 bitbit 位既可以是 00 也可以是 11,共有 2bit2^{bit} 种动物,减去现有的 nn 种动物即可。

    注意要特判 bit=64,n=0bit=64,n=0 的情况。读入量较大,建议写快读。

    此外 bucbuc 数组可以用 unsigned long long 变量代替,这样就做到了时间 O(n+m)O(n+m),空间 O(1)O(1)

    非考场代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    #define ull unsigned long long
    #define gc getchar()
    
    inline ull rd(){
    	ull x=0; char s=gc;
    	while(!isdigit(s))s=gc;
    	while(isdigit(s))x=(x<<1)+(x<<3)+s-'0',s=gc;
    	return x;
    } ull n,m,c,k,ans,lim,hv;
    
    int main(){
    	n=rd(),m=rd(),c=rd(),k=rd();
    	for(int i=1;i<=n;i++)hv|=rd(); // 统计每个位是否有 1
    	for(int i=1;i<=m;i++)lim|=1ull<<rd(),rd(); // 统计有限制的位
    	for(int i=0;i<k;i++)ans+=!((lim>>i)&1)||((hv>>i)&1); // 如果当前位有 1, 或者没有限制,那么都可以选
    	if(ans==64&&!n)puts("18446744073709551616");
    	else cout<<(ans==64?-n:(1ull<<ans)-n)<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    6259
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者