为什么这么多原题......

T1:
20180620小测

20180620小测
这题我做过,「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 }
View Code

相关文章:

  • 2021-06-13
  • 2021-08-11
  • 2022-01-23
  • 2021-06-07
  • 2022-01-20
  • 2021-12-20
  • 2021-10-29
猜你喜欢
  • 2021-09-26
  • 2022-12-23
  • 2021-12-28
  • 2021-08-10
  • 2021-11-10
  • 2022-02-07
  • 2021-05-28
相关资源
相似解决方案