为什么这么多原题......
T1:
这题我做过,「BZOJ2568: 比特集合」了解一下,此题终结。
代码:
1 #pragma GCC optimize("Ofast") 2 #include<cstdio> 3 #include<algorithm> 4 #include<tr1/unordered_set> 5 #include<cctype> 6 typedef long long int lli; 7 using namespace std; 8 using namespace tr1; 9 const int maxk=18; 10 const lli lim=(1<<18)+5; 11 12 struct BinaryIndexTree { 13 int dat[lim]; 14 #define lowbit(x) (x&-x) 15 inline void update(int pos,const int &x) { 16 while( pos < lim ) dat[pos] += x , pos += lowbit(pos); 17 } 18 inline int query(int pos) { 19 int ret = 0; 20 while(pos) ret += dat[pos] , pos -= lowbit(pos); 21 return ret; 22 } 23 }bit[maxk]; 24 25 lli sum; 26 unordered_multiset<lli> app; 27 28 inline void update(lli x,const int &t) { 29 for(int i=0;i<maxk;i++) bit[i].update( ( x & ((1<<(i+1))-1) ) + 1 , t ); 30 } 31 inline int query(int x) { 32 int l = 1 << x , r = ( 1 << ( x + 1 ) ) - 1 , ret = 0; 33 ret += bit[x].query( min( lim - 1 , max( 0ll , r - ( sum & ((1<<(x+1))-1) ) + 1 ) ) ); 34 ret -= bit[x].query( min( lim - 1 , max( 0ll , l - ( sum & ((1<<(x+1))-1) ) ) ) ); 35 l |= 1 << ( x + 1 ) , r |= 1 << ( x + 1 ); 36 ret += bit[x].query( min( lim - 1 , max( 0ll , r - ( sum & ((1<<(x+1))-1) ) + 1 ) ) ); 37 ret -= bit[x].query( min( lim - 1 , max( 0ll , l - ( sum & ((1<<(x+1))-1) ) ) ) ); 38 return ret; 39 } 40 41 inline char nextchar() { 42 static const int BS = 1 << 21; 43 static char buf[BS],*st,*ed; 44 if( st == ed ) ed = buf + fread(st=buf,1,BS,stdin); 45 return st == ed ? -1 : *st++; 46 } 47 inline int getint() { 48 int ret = 0 , ch , fix = 1; 49 while( !isdigit(ch=nextchar()) ) fix = ch == '-' ? -fix : fix; 50 do ret = ret * 10 + ch - '0'; while( isdigit(ch=nextchar()) ); 51 return ret * fix; 52 } 53 54 int main() { 55 static int n; 56 static lli x; 57 n = getint(); 58 for(int i=1,o;i<=n;i++) { 59 o = getint() , x = getint(); 60 if( o == 2 ) sum += x; 61 else if( o == 0 ) x -= sum , app.insert(x) , update(x,1); 62 else if( o == 1 ) x -= sum , update(x,-(signed)app.count(x)) , app.erase(x); 63 else printf("%d\n",query(x)); 64 } 65 return 0; 66 }