HDU 6085 Rikka with Candies(bitset)

来源:互联网 发布:瑞虎3轮毂数据 编辑:程序博客网 时间:2024/05/22 11:40

Description

给出两个序列A1,...,nB1,...,m,给出q次查询,每次查询给出一整数k,查询满足Aik mod Bj(i,j)对数

Input

第一行一整数T表示用例组数,每组用例首先输入三个整数n,m,q分别表示两个序列的长度和查询数,之后输入A1,...,nB1,...,m,最后q行每行一个整数k表示一个查询

(1T5,1n,m,q50000,1Ai,Bi50000,0k<max Bi,AiAj,BiBj,ij)

Output

对于每组查询,输出满足Aik mod Bj(i,j)对数,结果模2

Sample Input

1
5 5 5
1 2 3 4 5
1 2 3 4 5
0 1 2 3 4

Sample Output

0
0
0
0
1

Solution

Aik mod Bj等价于Aik0 mod Bj,且注意到k<Bj,用bitset存AB,从大到小枚举k,每次把大于kBj插入到B中,那么ans[k]=((A>>k)&B).count()&1,时间复杂度O(M232),M=max Bj

Code

#include<cstdio>#include<bitset> #include<cstring>using namespace std;namespace fastIO {    #define BUF_SIZE 100000    //fread -> read    bool IOerror=0;    inline char nc()     {        static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;        if(p1==pend)         {            p1=buf;            pend=buf+fread(buf,1,BUF_SIZE,stdin);            if(pend==p1)             {                IOerror=1;                return -1;            }        }        return *p1++;    }    inline bool blank(char ch)     {        return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';    }    inline void read(int &x)     {        char ch;        while(blank(ch=nc()));        if(IOerror)return;        for(x=ch-'0';(ch=nc())>='0'&&ch<='9';x=x*10+ch-'0');    }    inline void readc(char &x)    {        char ch;        while(blank(ch=nc()));        if(IOerror)return;        x=ch;    }    #undef BUF_SIZE};using namespace fastIO;#define maxn 50005bitset<maxn>A,B;int T,n,m,q,b[maxn],ans[maxn];int main(){    read(T);    //scanf("%d",&T);    while(T--)    {        read(n),read(m),read(q);        //scanf("%d%d%d",&n,&m,&q);        A.reset(),B.reset();        for(int i=1;i<=n;i++)        {            int a;            read(a);            //scanf("%d",&a);            A.set(a);        }        memset(b,0,sizeof(b));        int M=0;        for(int i=1;i<=m;i++)        {            int a;            read(a);            //scanf("%d",&a);            b[a]=1;M=max(M,a);        }        for(int i=0;i<=M;i++)ans[i]=0;        for(int i=M;i>=0;i--)        {            ans[i]=((B<<i)&A).count()&1;            if(b[i])                for(int k=0;k<=M;k+=i)B.flip(k);        }        while(q--)        {            int k;            read(k);            //scanf("%d",&k);            printf("%d\n",ans[k]);        }    }    return 0;}
原创粉丝点击