zoukankan      html  css  js  c++  java
  • 【WC2017】挑战

      卡常真好玩,卡到了loj rank1(2019.1.29)

    // luogu-judger-enable-o2
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    typedef unsigned int u32;
    typedef unsigned long long u64;
    
    inline void output_arr(u32 *A, u32 size) {
        u32 ret = size * sizeof(u32);
        u32 x = 23333333;
        const u32 * ed = A + size;
        for (u32*i=A;i!=ed; ++ i){
            ret^=*i+x,x^=x<<13,x^=x>>17,x^=x<<5;
        }
        printf("%u
    ", ret);
    }
    
    namespace Sorting {
        int cnt0[256],cnt8[256],cnt16[256],cnt24[256];
        u32 *a,*b;
        inline void init_data(u32 *a, int n,u32 seed) {
            const u32 * ed = a + n;
            for (u32*i = a; i != ed; ++ i){
                seed ^= seed << 13,seed ^= seed >> 17,seed ^= seed << 5;
                *i=seed;
                ++cnt0[seed & 255], ++cnt8[seed >> 8 & 255],
                ++cnt16[seed >> 16 & 255], ++cnt24[seed >> 24];
            }
            for(int i=1;i<256;++i)
                cnt0[i] += cnt0[i-1],
                cnt8[i] += cnt8[i-1],
                cnt16[i] += cnt16[i-1],
                cnt24[i] += cnt24[i-1];
            register u32*i;
            for(i=a+n-1;i>a;i-=8){
                b[--cnt0[*i&255]]=*i;
                b[--cnt0[i[-1]&255]]=i[-1];
                b[--cnt0[i[-2]&255]]=i[-2];
                b[--cnt0[i[-3]&255]]=i[-3];
                b[--cnt0[i[-4]&255]]=i[-4];
                b[--cnt0[i[-5]&255]]=i[-5];
                b[--cnt0[i[-6]&255]]=i[-6];
                b[--cnt0[i[-7]&255]]=i[-7];
            }
            for(i=b+n-1;i>b;i-=8){
                a[--cnt8[*i>>8&255]]=*i;
                a[--cnt8[i[-1]>>8&255]]=i[-1];
                a[--cnt8[i[-2]>>8&255]]=i[-2];
                a[--cnt8[i[-3]>>8&255]]=i[-3];
                a[--cnt8[i[-4]>>8&255]]=i[-4];
                a[--cnt8[i[-5]>>8&255]]=i[-5];
                a[--cnt8[i[-6]>>8&255]]=i[-6];
                a[--cnt8[i[-7]>>8&255]]=i[-7];
            }
            for(i=a+n-1;i>a;i-=8){
                b[--cnt16[*i>>16&255]]=*i;
                b[--cnt16[i[-1]>>16&255]]=i[-1];
                b[--cnt16[i[-2]>>16&255]]=i[-2];
                b[--cnt16[i[-3]>>16&255]]=i[-3];
                b[--cnt16[i[-4]>>16&255]]=i[-4];
                b[--cnt16[i[-5]>>16&255]]=i[-5];
                b[--cnt16[i[-6]>>16&255]]=i[-6];
                b[--cnt16[i[-7]>>16&255]]=i[-7];
            }
            for(i=b+n-1;i>b;i-=8){
                a[--cnt24[*i>>24]]=*i;
                a[--cnt24[i[-1]>>24]]=i[-1];
                a[--cnt24[i[-2]>>24]]=i[-2];
                a[--cnt24[i[-3]>>24]]=i[-3];
                a[--cnt24[i[-4]>>24]]=i[-4];
                a[--cnt24[i[-5]>>24]]=i[-5];
                a[--cnt24[i[-6]>>24]]=i[-6];
                a[--cnt24[i[-7]>>24]]=i[-7];
            }
        }
        int n;
        inline void main() {
            register u32 seed;
            scanf("%d%u", &n, &seed);
            a = new u32[n<<1];
            b = a + n;
            init_data(a, n, seed);
            output_arr(a, n);
        }
    }
    
    namespace Game {
        int n,q;
    
        u64 f1[64][20000];
        u64 f2[64][20000];
        inline void add(u64 f[64][20000],int bit){
            if(bit < 64)
                for(int i=0;i<=bit;++i)
                    *f[i]|=1ull<< bit-i;
            else for(int i=0;i<64;++i)
                    f[i][bit-i>>6] |= 1ull << (bit-i&63);
        }
        inline void init(char * s1,char * s2){
            for(int i=0;i<n;++i){
                if(s1[i]=='0')add(f1,i*3);
                if(s1[i]=='1')add(f1,i*3+1);
                if(s1[i]=='2')add(f1,i*3+2);
                if(s2[i]=='0')add(f2,i*3+2);
                if(s2[i]=='1')add(f2,i*3);
                if(s2[i]=='2')add(f2,i*3+1);
            }
        }
        void main() {
            scanf("%d%d", &n, &q);
            char *s1 = new char[n + 1];
            char *s2 = new char[n + 1];
            scanf("%s%s", s1, s2);
            init(s1,s2);
            u32 *anss = new u32[q];
            for (int k = 0; k < q; ++k) {
                int x,y,len;
                scanf("%d%d%d",&x,&y,&len);
                x*=3,y*=3,len*=3;
                int l = len >> 6;
                u64*i=f1[x&63]+(x>>6),*j=f2[y&63]+(y>>6);
                int ans=0,cnt=0;
                for(;cnt+8<l;cnt+=8,i+=8,j+=8){
                    ans+=__builtin_popcountll(i[0]&j[0]);
                    ans+=__builtin_popcountll(i[1]&j[1]);
                    ans+=__builtin_popcountll(i[2]&j[2]);
                    ans+=__builtin_popcountll(i[3]&j[3]);
                    ans+=__builtin_popcountll(i[4]&j[4]);
                    ans+=__builtin_popcountll(i[5]&j[5]);
                    ans+=__builtin_popcountll(i[6]&j[6]);
                    ans+=__builtin_popcountll(i[7]&j[7]);
                }
                for(;cnt<l;++cnt,++i,++j) ans+=__builtin_popcountll(*i&*j);
                anss[k]=ans+__builtin_popcountll(*i&*j&(1ull<<(len&63))-1);
            }
            output_arr(anss, q);
        }
    }
    
    namespace Parentheses {
        u32 f[366666*2],*id=f+366666;
        u32 p[366666*2],*g=p+366666;
        int cur=1;
        void main() {
            int n;
            scanf("%d", &n);
            char *s = new char[n + 1];
            scanf("%s", s);
            id[0]=1;
            for(int i=0;i<n;++i){
                if(s[i] == ')')
                    *id++=0;
                if(s[i] == '(')
                    *--id=0;
                if (i !=n-1 && s[i] == '?' && s[i+1] == '?'){
                    *--id=0,*--id=0;
                    id[0]=id[2]+id[4];
                    id[1]=id[3]*2+id[5];
                    const int ed=std::min(i+4,n - i + 4);
                    for(int j=2+(i&1);j<=ed;){
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                    }
                    ++i;
                    continue;
                }
                if(s[i] == '?'){
                    *--id=0;
                    const int ed=std::min(i+2,n-i+2);
                    for(u32 j=!(i&1);j<=ed;){
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                    }
                }
            }
            printf("%u
    ", id[0]);
        }
    }
    
    int main() {
        int task_id;
        scanf("%d", &task_id);
    
        switch (task_id) {
            case 1:
                Sorting::main();
                break;
            case 2:
                Game::main();
                break;
            case 3:
                Parentheses::main();
                break;
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    Python元组、列表、字典
    测试通过Word直接发布博文
    Python环境搭建(windows)
    hdu 4003 Find Metal Mineral 树形DP
    poj 1986 Distance Queries LCA
    poj 1470 Closest Common Ancestors LCA
    poj 1330 Nearest Common Ancestors LCA
    hdu 3046 Pleasant sheep and big big wolf 最小割
    poj 3281 Dining 最大流
    zoj 2760 How Many Shortest Path 最大流
  • 原文地址:https://www.cnblogs.com/skip1978/p/10332528.html
Copyright © 2011-2022 走看看