zoukankan      html  css  js  c++  java
  • COGS 2479 奇怪的姿势卡♂过去 (bitset+折半)

    思路:
    此题显然是CDQ套CDQ套树套树
    然而我懒
    想用一种奇怪的姿势卡过去

    就出现了以下解法

    5w*5w/8的bitset   hiahiahia
    但是空间会爆怎么办啊…   折半~ 变成5w*2.5w/8完美卡过去
    时间会慢很多么    并没有~~完全可以过 甚至比某些姿势不好的树套树快hiahiahia

    代码是不是很短~

    //By SiriusRen
    #include <bitset>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n;long long ans;
    bitset<25000>b[50000],jy;
    struct Node{int a,b,c,id;}node[50000];
    bool cmpa(const Node &a,const Node &b){return a.a<b.a;}
    bool cmpb(const Node &a,const Node &b){return a.b<b.b;}
    bool cmpc(const Node &a,const Node &b){return a.c<b.c;}
    inline int rd(){
        int x=0;char p=getchar();
        while(p<'0'||p>'9')p=getchar();
        while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
        return x;
    }
    int main(){
        freopen("partial_order.in","r",stdin);
        freopen("partial_order.out","w",stdout);
        scanf("%d",&n);
        register int i;
        for(i=0;i<n/2;i++)b[i]|=jy,jy.set(i);
        for(i=n/2;i<n;i++)b[i]|=jy;
        for(i=0;i<n;i++)node[i].a=rd();
        for(i=0;i<n;i++)node[i].b=rd();
        for(i=0;i<n;node[i].id=i,i++)node[i].c=rd();
        jy.reset();sort(node,node+n,cmpa);
        for(i=0;i<n;i++){b[node[i].id]&=jy;if(node[i].id<n/2)jy.set(node[i].id);}
        jy.reset();sort(node,node+n,cmpb);
        for(i=0;i<n;i++){b[node[i].id]&=jy;if(node[i].id<n/2)jy.set(node[i].id);}
        jy.reset();sort(node,node+n,cmpc);
        for(i=0;i<n;i++){b[node[i].id]&=jy;if(node[i].id<n/2)jy.set(node[i].id);}
        for(i=0;i<n;i++)ans+=b[i].count();
        jy.reset();
        for(i=0;i<n;i++)b[i].reset();
        for(i=n/2;i<n;i++)b[i]|=jy,jy.set(i-n/2);
        jy.reset();sort(node,node+n,cmpa);
        for(i=0;i<n;i++){b[node[i].id]&=jy;if(node[i].id>=n/2)jy.set(node[i].id-n/2);}
        jy.reset();sort(node,node+n,cmpb);
        for(i=0;i<n;i++){b[node[i].id]&=jy;if(node[i].id>=n/2)jy.set(node[i].id-n/2);}
        jy.reset();sort(node,node+n,cmpc);
        for(i=0;i<n;i++){b[node[i].id]&=jy;if(node[i].id>=n/2)jy.set(node[i].id-n/2);}
        for(i=0;i<n;i++)ans+=b[i].count();
        printf("%lld
    ",ans);
    }

    这里写图片描述

  • 相关阅读:
    Shiro安全框架之集成 Web(下)
    Shiro安全框架之集成 Web(中)
    Shiro安全框架之集成 Web(上)
    01背包
    巴什博弈
    斐波那契博弈
    一. 至少转最多
    平面分割类问题
    求凸包(安德鲁算法)
    GCD和exGCD
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532062.html
Copyright © 2011-2022 走看看