zoukankan      html  css  js  c++  java
  • hdu 6085 (bitset)

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <bitset>
    
    using namespace std;
    bitset<50000+10>a,b,ans,t;
    /**
     * 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6085
     * 题目意思:给定A,B两个数组,分别n,m;个元素,q次查询,每次询问,A%B==k有多少对数?答案mod2再输出。
     * 思路:如题解所说bitset大法,先说明bitset位标记。reset() 表示清空为0,
     * set(i)表示将第i为二进制设为1,flip(i),将第i位取反,count()统计二进制位1的个数
     *  那么原问题,是 (A-k)%B==0 的个数。我们可以从B数组中的最大值进行枚举。位标记出现的,k>=max的一定为0;
     * 当枚举到ans[i]时,B数组中大于等于i的元素都会为ans[i]贡献答案,所以我用t数组表示:B数组中大于等于i的元素的倍数;
     * 所以ans[i]=(t&(a>>i))二进制1的个数;
     */
    int main()
    {
        int ncase;
        scanf("%d",&ncase);
        while(ncase--)
        {
            int n,m,q,x,mx=0;
            a.reset(),b.reset(),ans.reset(),t.reset();
            scanf("%d%d%d",&n,&m,&q);
            for(int i=0;i<n;i++) scanf("%d",&x),a.set(x);
            for(int i=0;i<m;i++) scanf("%d",&x),b.set(x),mx=max(mx,x);
            for(int i=mx;i>=0;i--)
            {
                ans[i]=(t&(a>>i)).count()&1;
                if(b[i]) for(int j=0;j<=50000;j+=i) t.flip(j);
            }
            while(q--)
            {
                scanf("%d",&x);
                printf("%d
    ",ans[x]?1:0);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    I Hate It
    hdu 2112 HDU Today ( Dijkstra )
    hdu 1280 前m大的数
    hdu 4252 A Famous City
    hdu 2647 Reward
    hdu 2845 Beans
    hdu 3548 Enumerate the Triangles ( 优 化 )
    hdu 3552 I can do it! (贪心)
    HDU 3033 I love sneakers!(分组背包变形)
    hdu 1712 ACboy needs your help 分组背包
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7349030.html
Copyright © 2011-2022 走看看