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;
}

 

posted @ 2019-02-21 20:33  AKCqhzdy  阅读(172)  评论(0编辑  收藏  举报