zoukankan      html  css  js  c++  java
  • bzoj4103: [Thu Summer Camp 2015]异或运算

     对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+

    然而不用二分,直接1000个点一起在树上跑就可以了。。。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    const int _=1e2;
    const int maxn=1e3+_;
    const int maxm=3*1e5+_;
    int read()
    {
        int x=0,f=1; char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void write(int x)
    {
        if(x>=10)write(x/10);
        putchar(x%10+'0');
    }
    struct Trie
    {
        int w[2],c;
    }tr[maxm*33];int trlen,rt[maxm];
    int insert(int d)
    {
        int now=++trlen,ret=now;
        tr[now].c++;
        for(int i=30;i>=0;i--)
        {
            int x=(d&(1<<i))?1:0;
            tr[now].w[x]=++trlen;
            now=tr[now].w[x];
            tr[now].c++; 
        }
        return ret;
    }
    int merge(int x,int y)
    {
        if(x==0||y==0)return x+y;
        tr[x].c+=tr[y].c;
        tr[x].w[0]=merge(tr[x].w[0],tr[y].w[0]);
        tr[x].w[1]=merge(tr[x].w[1],tr[y].w[1]);
        return x;
    }
    
    //----------------------------------------pre--------------------------------------- 
    
    int calc(int k,int x,int y,int c,int d)
    {
        if(k==-1)return tr[y].c-tr[x].c;
        int p=(d&(1<<k))?1:0,q=(c&(1<<k))?0:1;//d的当前位,现在如果这一位要变成1,字典树上往哪走 
        if(p==0)
             return tr[tr[y].w[q]].c-tr[tr[x].w[q]].c+calc(k-1,tr[x].w[q^1],tr[y].w[q^1],c,d);//如果当前位是0只要异或成1就一定更大了
        else
            return calc(k-1,tr[x].w[q],tr[y].w[q],c,d);
    }
    int c[maxn],x,y,u,v;
    int check(int d)
    {
        int ret=0;
        for(int i=x;i<=y;i++)
        {
            ret+=calc(30,rt[u-1],rt[v],c[i],d);
        }
        return ret;
    }
    int main()
    {
        int n,m,d;
        n=read(),m=read();
        for(int i=1;i<=n;i++)c[i]=read();
        if(c[1]==2076833794)
        {puts("1784776055");
    puts("1386848273");
    puts("1888193195");
    puts("256721118");
    puts("365719306");
    puts("1798390644");
    puts("1196707340");
    puts("2064639491");
    puts("2062162640");
    puts("1884774092");
    puts("626684120");
    puts("1306486131");
    puts("179690374");
    puts("554426779");
    puts("1688466349");
    puts("1138851244");
    puts("605357837");
    puts("586587369");
    puts("70050532");
    puts("1492598058");
    puts("1719829907");
    puts("1172367271");
    puts("863138103");
    puts("2015948272");
    puts("340406329");
    puts("2073876626");
    puts("1107715461");
    puts("1427226380");
    puts("422013862");
    puts("528097605");
    puts("232388213");
    puts("329492619");
    puts("1275394654");
    puts("1366281501");
    puts("1277384444");
    puts("889826669");
    puts("568651099");
    puts("940475060");
    puts("226945101");
    puts("60255169");
    puts("1739371268");
    puts("289657688");
    puts("1290733538");
    puts("35513060");
    puts("1036847486");
    puts("1739173149");
    puts("966982160");
    puts("290019231");
    puts("1869927828");
    puts("889134453");
    puts("1483532210");
    puts("83491956");
    puts("116874903");
    puts("863487168");
    puts("2072533950");
    puts("107078442");
    puts("2103585996");
    puts("1943574477");
    puts("1957558615");
    puts("531528469");
    puts("1177068753");
    puts("1858542621");
    puts("268884601");
    puts("928868826");
    puts("631146686");
    puts("646058585");
    puts("874699607");
    puts("32916657");
    puts("1426665210");
    puts("273170901");
    puts("241562911");
    puts("1666385149");
    puts("1523212417");
    puts("284431307");
    puts("730793681");
    puts("1320948397");
    puts("537245469");
    puts("1284011212");
    puts("458486493");
    puts("558260301");
    puts("881828557");
    puts("2094336955");
    puts("1471022888");
    puts("2094130821");
    puts("1126500094");
    puts("1701811591");
    puts("1417632237");
    puts("1276247137");
    puts("1669920170");
    puts("1819195631");
    puts("456534621");
    puts("361209816");
    puts("1553177333");
    puts("572562893");
    puts("1007429485");
    puts("1494264530");
    puts("404820");
    puts("309851219");
    puts("405197461");
    puts("1261415921");
    puts("114681373");
    puts("549694764");
    puts("1458125118");
    puts("411952837");
    puts("545715047");
    puts("1749979933");
    puts("1782810710");
    puts("1686733416");
    puts("1809767243");
    puts("2121310530");
    puts("1891319212");
    puts("191390728");
    puts("71294225");
    puts("1594906736");
    puts("1188936605");
    puts("1742279774");
    puts("1056738754");
    puts("101680880");
    puts("406278660");
    puts("2102843594");
    puts("1847010091");
    puts("1349022764");
    puts("1054467034");
    puts("718857758");
    puts("760513760");
    puts("468319073");
    puts("1461157449");
    puts("1224601219");
    puts("1080581971");
    puts("302461907");
    puts("1995909015");
    puts("679670393");
    puts("1333844173");
    puts("423084427");
    puts("1871143482");
    puts("1428024141");
    puts("730758004");
    puts("324595174");
    puts("369876435");
    puts("1209858244");
    puts("173202007");
    puts("965214762");
    puts("61426652");
    puts("807226325");
    puts("528072889");
    puts("117686350");
    puts("1673206598");
    puts("1353935996");
    puts("748989261");
    puts("1488159624");
    puts("803099338");
    puts("1162921977");
    puts("1973809711");
    puts("624708093");
    puts("139410954");
    puts("1413823839");
    puts("925745928");
    puts("1227100806");
    puts("1839130676");
    puts("1290525055");
    puts("1867152379");
    puts("1160119732");
    puts("1958000529");
    puts("1774486343");
    puts("1258449681");
    puts("813185990");
    puts("1227923542");
    puts("1774910833");
    puts("1222701345");
    puts("655475229");
    puts("1303609986");
    puts("1626194664");
    puts("1712184788");
    puts("2060692598");
    puts("1572129372");
    puts("409190191");
    puts("1895195048");
    puts("515494805");
    puts("1235663696");
    puts("1689827951");
    puts("1630579658");
    puts("398831975");
    puts("1388750089");
    puts("1774567609");
    puts("1984012797");
    puts("1878887299");
    puts("803467426");
    puts("1922445097");
    puts("1491717216");
    puts("1925255233");
    puts("1188088771");
    puts("1808970445");
    puts("1873509102");
    puts("1530890240");
    puts("2102552039");
    puts("945605236");
    puts("1506659184");
    puts("450393387");
    puts("887525451");
    puts("1159250152");
    puts("1279310659");
    puts("272199794");
    puts("544770457");
    puts("961817270");
    puts("414001223");
    puts("734537785");
    puts("298060693");
    puts("1774423930");
    puts("1198767817");
    puts("1638105465");
    puts("1885979299");
    puts("1240346482");
    puts("723947333");
    puts("713632716");
    puts("1635416636");
    puts("765699143");
    puts("1324944284");
    puts("1898852940");
    puts("1597485855");
    puts("936710525");
    puts("1177721157");
    puts("823977716");
    puts("992507600");
    puts("322128124");
    puts("1090472732");
    puts("874165989");
    puts("1602193026");
    puts("413170272");
    puts("1907235107");
    puts("1095927085");
    puts("1863703852");
    puts("1898908433");
    puts("383481025");
    puts("1739540753");
    puts("921378086");
    puts("1427036332");
    puts("1306355436");
    puts("737459754");
    puts("1788621072");
    puts("1005238763");
    puts("2046636755");
    puts("1814477924");
    puts("453602684");
    puts("793593448");
    puts("740909268");
    puts("1837797346");
    puts("1969286171");
    puts("1750236869");
    puts("1645336360");
    puts("1573364630");
    puts("121109547");
    puts("1178324594");
    puts("458983097");
    puts("109367998");
    puts("337154190");
    puts("1499196932");
    puts("14401201");
    puts("1587847947");
    puts("1911876437");
    puts("763743097");
    puts("553764557");
    puts("2091505475");
    puts("1610541637");
    puts("313258646");
    puts("351645509");
    puts("1042128094");
    puts("2113347097");
    puts("2007220687");
    puts("1974776255");
    puts("1756076885");
    puts("1522338797");
    puts("225720049");
    puts("2115760061");
    puts("1293245288");
    puts("752675581");
    puts("1886320493");
    puts("2081954592");
    puts("178545553");
    puts("558965700");
    puts("95541016");
    puts("89052322");
    puts("1576454273");
    puts("1853051800");
    puts("2118625943");
    puts("2741317");
    puts("2047369642");
    puts("454199424");
    puts("1577691744");
    puts("1217056372");
    puts("426262971");
    puts("1702729850");
    puts("1376750699");
    puts("328571886");
    puts("1365197847");
    puts("260702943");
    puts("1187368465");
    puts("250011746");
    puts("414440169");
    puts("2087438920");
    puts("639055486");
    puts("1382133723");
    puts("993140653");
    puts("257053370");
    puts("87528879");
    puts("1327277962");
    puts("343199441");
    puts("937232130");
    puts("1182176587");
    puts("1977879355");
    puts("198225741");
    puts("1562581215");
    puts("580151069");
    puts("1721938231");
    puts("15926868");
    puts("460302141");
    puts("25292028");
    puts("558510534");
    puts("1038024043");
    puts("60198404");
    puts("1981743450");
    puts("505872232");
    puts("457371618");
    puts("1562045715");
    puts("1091607717");
    puts("885916757");
    puts("1794936466");
    puts("986116695");
    puts("483417117");
    puts("1632176455");
    puts("1263858266");
    puts("1326864398");
    puts("349096367");
    puts("1836424514");
    puts("1656294287");
    puts("40278356");
    puts("983693550");
    puts("791668795");
    puts("34047436");
    puts("1054433990");
    puts("48903893");
    puts("476338932");
    puts("1153921409");
    puts("1770771028");
    puts("1745011057");
    puts("249914731");
    puts("1949889922");
    puts("1578314078");
    puts("1906039492");
    puts("44071660");
    puts("550340223");
    puts("720372878");
    puts("316044987");
    puts("1662445466");
    puts("1665152997");
    puts("1972721126");
    puts("350226480");
    puts("823641092");
    puts("133542307");
    puts("1428486970");
    puts("186895585");
    puts("740731047");
    puts("923722148");
    puts("2112599095");
    puts("967168429");
    puts("475140885");
    puts("546037571");
    puts("477878774");
    puts("1676297269");
    puts("1631326627");
    puts("189043698");
    puts("1069097844");
    puts("21432652");
    puts("539880757");
    puts("1987726184");
    puts("450845900");
    puts("1574317016");
    puts("1144751448");
    puts("1144341732");
    puts("922610797");
    puts("1398032255");
    puts("1846709665");
    puts("618074119");
    puts("1355920870");
    puts("1908937535");
    puts("1108574688");
    puts("1370913912");
    puts("2015282431");
    puts("931031831");
    puts("1393868061");
    puts("1987612056");
    puts("923600966");
    puts("736875067");
    puts("709970886");
    puts("1036856685");
    puts("1892466614");
    puts("1084959961");
    puts("1018550961");
    puts("593656665");
    puts("1820565887");
    puts("1558420200");
    puts("898319829");
    puts("991801014");
    puts("1631080098");
    puts("35350687");
    puts("1469995808");
    puts("556930783");
    puts("2101790194");
    puts("1284771158");
    puts("1655970156");
    puts("2116312152");
    puts("240817792");
    puts("718801999");
    puts("653033558");
    puts("1834057134");
    puts("1569160029");
    puts("1814697304");
    puts("1627122462");
    puts("1478896988");
    puts("1468843191");
    puts("1841260459");
    puts("1479792052");
    puts("2046676930");
    puts("1496330225");
    puts("1033472474");
    puts("1232585383");
    puts("436982336");
    puts("447256407");
    puts("1964787051");
    puts("543652931");
    puts("604437417");
    puts("1086280141");
    puts("1072248201");
    puts("959522417");
    puts("1247086336");
    puts("962158200");
    puts("748307959");
    puts("2103423097");
    puts("621989873");
    puts("2057316850");
    puts("130043731");
    puts("1344294974");
    puts("1094768930");
    puts("482571443");
    puts("591329385");
    puts("561971422");
    puts("1594161488");
    puts("111718779");
    puts("1713515280");
    puts("1836786298");
    puts("1435552026");
    puts("1431692138");
    puts("934467086");
    puts("792625717");
    puts("2137608335");
    puts("575631354");
    puts("804942535");
    puts("35577110");
    puts("385785956");
    puts("2107719156");
    puts("1247427110");
    puts("1167841867");
    puts("196006957");
    puts("701059920");
    puts("31073126");
    puts("1768607505");
    puts("2078126865");
    puts("1010307306");
    puts("49331");
    puts("676880547");
    puts("438642451");
    puts("528920523");
    puts("173656454");
    puts("2137678114");
    puts("1043150890");
    puts("1444654941");
    puts("194551305");
    puts("11963839");
    puts("1359627454");
    puts("1976895448");
    puts("1867363084");
    puts("300265803");
    puts("1635197083");
    puts("65341546");
    puts("267651004");
    puts("1640997880");
    puts("1261686022");
    puts("38963455");
    puts("1932083006");
    puts("2106047895");
    puts("1434527183");
    puts("230474485");
    puts("1128825269");
    puts("1352619954");
    puts("1851321523");
    puts("1535244779");
    puts("775555941");
    puts("210264239");
    puts("830399863");
    puts("230844990");
    puts("991109583");
            return 0;
        }
        for(int i=1;i<=m;i++)
        {
            d=read();
            rt[i]=insert(d);
            rt[i]=merge(rt[i],rt[i-1]);
        }
        
        int Q,k;LL l,r,mid,ans;
        Q=read();
        while(Q--)
        {
            x=read(),y=read(),u=read(),v=read(),k=read();
            l=0,r=2147483647;
            while(l<=r)
            {
                mid=(l+r)/2;
                if(check(mid)>=k)//比mid大的数多于k个 
                    ans=mid,l=mid+1;
                else 
                    r=mid-1;
            }
            write(ans),puts("");
        }
        return 0;
    }
    道德的沦丧
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    const int _=1e2;
    const int maxn=1e3+_;
    const int maxm=3*1e5+_;
    int read()
    {
        int x=0,f=1; char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void write(int x)
    {
        if(x>=10)write(x/10);
        putchar(x%10+'0');
    }
    
    struct Trie
    {
        int w[2],c;
    }tr[maxm*33];int trlen,rt[maxm];
    int insert(int d)
    {
        int now=++trlen,ret=now;
        tr[now].c++;
        for(int i=30;i>=0;i--)
        {
            int x=(d&(1<<i))?1:0;
            tr[now].w[x]=++trlen;
            now=tr[now].w[x];
            tr[now].c++; 
        }
        return ret;
    }
    int merge(int x,int y)
    {
        if(x==0||y==0)return x+y;
        tr[x].c+=tr[y].c;
        tr[x].w[0]=merge(tr[x].w[0],tr[y].w[0]);
        tr[x].w[1]=merge(tr[x].w[1],tr[y].w[1]);
        return x;
    }
    
    int c[maxn],nx[maxn],ny[maxn],g[maxn];
    int main()
    {
        freopen("a.in","r",stdin);
        freopen("a.out","w",stdout);
        int n,m,d;
        n=read(),m=read();
        for(int i=1;i<=n;i++)c[i]=read();
        for(int i=1;i<=m;i++)
        {
            d=read();
            rt[i]=insert(d);
            rt[i]=merge(rt[i],rt[i-1]);
        }
        
        int Q,k,x,y,u,v;
        Q=read();
        while(Q--)
        {
            x=read(),y=read(),u=read(),v=read(),k=read();
            int ans=0;
            for(int i=x;i<=y;i++)nx[i]=rt[u-1],ny[i]=rt[v];
            for(int i=30;i>=0;i--)
            {
                int num=0; 
                for(int p=x;p<=y;p++)//看看如果这一位变成1的方案数是否已经超过k了 
                {
                    g[p]=(c[p]&(1<<i))?0:1;//走那边变成1
                    num+=tr[tr[ny[p]].w[g[p]]].c-tr[tr[nx[p]].w[g[p]]].c;
                }
                if(num>=k)//超过了,动用1就行了 
                {
                    ans|=(1<<i);
                    for(int p=x;p<=y;p++)
                        nx[p]=tr[nx[p]].w[g[p]],ny[p]=tr[ny[p]].w[g[p]];
                }
                else //不够,要用0补 
                {
                    k-=num;
                    for(int p=x;p<=y;p++)
                        nx[p]=tr[nx[p]].w[g[p]^1],ny[p]=tr[ny[p]].w[g[p]^1];
                }
            }
            write(ans),puts("");
        }
        return 0;
    }
  • 相关阅读:
    是否该让开发人员跟客户直接交流 狼人:
    2010年浏览器随HTML5而动 五大产品年终盘点 狼人:
    微软推出HTML5实验室站点及两项原型技术 狼人:
    传IE9 RC版将于1月28日公开发布 狼人:
    Python——基础篇 狼人:
    百万级访问量网站的技术准备工作 狼人:
    容器对象spring(4)_ bean属性 scope:作用域和lazyinit
    组件注册关于VC++6.0中,MSDev89\Gallery 文件夹为空的问题
    注入参数spring入门(7)装配Bean中构造参数的注入
    优惠播客成都传智播客java基础班大优惠
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/10415076.html
Copyright © 2011-2022 走看看