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; }
pain and happy in the cruel world.