zoukankan      html  css  js  c++  java
  • hdu6085[压位+暴力] 2017多校5

    /*hdu6085[压位+暴力] 2017多校5*/
    /*强行优化..*/
    #include <bits/stdc++.h>
    using namespace std;
    struct bits{ unsigned num[2000]; unsigned bitlen; bits(){memset(num,0,sizeof(num)),bitlen=0;} bits get(int l, int r) { bits ret; int length=r-l+1; int left,len1,len2,pos=0; left=l/32; len1=(l%32); len2=32-len1; while(length>0){ if(len2==32) ret.num[pos++]=num[left]; else ret.num[pos++]=(num[left]>>len1)|(num[left+1]<<len2); left++; length-=32; } pos--; if(length<0){ ret.num[pos]<<=(-length); ret.num[pos]>>=(-length); } ret.bitlen=pos+1; return ret; } void add(int p) { int next=p/32; int move=p%32; num[next]|=(1<<move); } void show(int p){ int next=p/32; int move=p%32; printf("%d",(num[next]&(1<<move))?1:0); } }; void Xor(bits& a,bits& b){ for(int i=0;i<(int)b.bitlen;i++){ a.num[i]^=b.num[i]; } } int T,n,m,q,b[50005]; void solve(){ int temp,maxA=0; bits A,B,ans; scanf("%d%d%d",&n,&m,&q); for(int i=0;i<n;i++){ scanf("%d",&temp); A.add(temp); maxA=max(temp,maxA); } for(int i=0;i<m;i++){ scanf("%d",&temp); for(int k=0;;k++){ if(((k+1)*temp-1)>maxA){ B=A.get(k*temp,maxA); Xor(ans,B); break; } else B=A.get(k*temp,(k+1)*temp-1); Xor(ans,B); } } for(int i=0;i<q;i++){ scanf("%d",&temp); ans.show(temp); puts(""); } } int main() { scanf("%d",&T); while(T--) solve(); return 0; }

    还有升级版本, 太强了.

    #include <bits/stdc++.h>
    using namespace std;
    struct bits {
        unsigned n[10010];
        void set(unsigned x) {n[x >> 5] |= (1 << (x & 31));}
        void flip(int x) {n[x >> 5] ^= (1 << (x & 31));}
        bool get(int x) {return n[x >> 5] & (1 << (x & 31));}
        void clear() {memset(n, 0x00, sizeof n);}
    } ans, a[35];
    int temp, maxa = 0, T, n, m, q;
    void getans(int l, int r) {
        while ((r - l) & 31) {
            r--; 
            if (a[0].get(r))
                ans.flip(r - l);
        }
        int pos = 0;
        while (l & 31) {
            l++; r++;
            pos++;
        }
        l >>= 5, r >>= 5;
        for (int i = l; i < r; i++) {
            ans.n[i - l] ^= a[pos].n[i];
        }
    }
    void init() {
        for (int i = 0; i < 32; i++) 
            a[i].clear();
        ans.clear();
        maxa = 0;
    }
    int main() {
        //freopen("1001.in","r",stdin);
        //freopen("out.txt","w",stdout);
        scanf("%d", &T);
        while (T--) {
            init();
            scanf("%d%d%d", &n, &m, &q);
            for (int i = 0; i < n; i++) {
                scanf("%d", &temp);
                for (int j = 0; j < 32; j++) {
                    a[j].set(temp + j);
                }
                maxa = max(maxa, temp);
            }
            for (int i = 0; i < m; i++) {
                scanf("%d", &temp);
                for (int j = 0; j <= maxa; j += temp) {
                    getans(j, min(maxa + 1, j + temp));
                }
            }
            for (int i = 0; i < q; i++) {
                scanf("%d", &temp);
                printf("%d
    ", (int)ans.get(temp));
            }
        }
        return 0;
    }

     

  • 相关阅读:
    mysql dump 完全备
    CentOS7位安装MySql教程
    mysql 数据备份
    Linux下iostat命令详解
    端口映射
    git+jenkins jar包代码的发布加新建项目
    腾讯面试题
    PHP-----类与对象,成员方法,成员属性,构造方法,析构方法
    PHP-----二维数组和二分查找
    PHP-----数组和常见排序算法
  • 原文地址:https://www.cnblogs.com/UnderSilenceee/p/7324696.html
Copyright © 2011-2022 走看看