zoukankan      html  css  js  c++  java
  • 学习分块

    用于记录所用的:

    参考博客: 

    分块入门1~9

    「分块」数列分块入门1 – 9 by hzwer

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N = 5e4+100;
     6 int L[N],R[N];  //第i块的左右边界下标
     7 int pos[N];     //下标标记,通过下标找块号
     8 int add[N];     //块内增量
     9 int a[N],n;
    10 inline int read(){
    11     char c = getchar();
    12     int x = 0 ,f=1 ;
    13     while ( !('0'<= c && c<='9') ){
    14         c = getchar();
    15         if ( c=='-') f=-1 ;
    16     }
    17     while ('0'<= c && c<='9'){
    18         x = x*10 + c-'0';
    19         c = getchar();
    20     }
    21     return x * f ;
    22 }
    23 void change(int x,int y,int c){
    24     int p = pos[x] , q = pos[y];
    25     //同一个块时
    26     if( p==q ) for(int i=x;i<=y;i++){ a[i] += c ; }
    27     //不同块时
    28     else{
    29         //中间的块直接加增量到add上
    30         for(int i=p+1;i<=q-1;i++) add[i] += c;
    31         //块内直接暴力跑
    32         for(int i=x;i<=R[p];i++)
    33             a[i] += c ;
    34         for(int i=L[q];i<=y;i++)
    35             a[i] += c ;
    36     }
    37 }
    38 int main()
    39 {
    40     n = read();
    41     for(int i=1;i<=n;i++) a[i] = read();
    42     int block = sqrt(n) ;
    43     for(int i=1;i<=block;i++){
    44         L[i] = (i-1)*block + 1 ;
    45         R[i] = i * block ;
    46     }
    47     if( R[block] < n ){
    48         block ++ ;
    49         L[block] = R[block-1]+1 ;
    50         R[block] = n ;
    51     }
    52     for(int i=1;i<=block;i++){
    53         for(int j=L[i];j<=R[i];j++){
    54             pos[j] = i ;
    55         }
    56     }
    57     int opt,x,y,c;
    58     for(int i=1;i<=n;i++){
    59         opt = read();
    60         x = read();
    61         y = read();
    62         c = read();
    63         if( opt == 0 ){
    64             change( x,y,c );
    65         }else{
    66             int No = pos[y];
    67             printf("%d
    ",a[y] + add[No]);
    68         }
    69     }
    70     return 0;
    71 }
    #1
     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cctype>
     4 #include<vector>
     5 #include<algorithm>
     6 using namespace std;
     7 const int N = 5e4+100;
     8 const int M = 505;
     9 int a[N],pos[N],add[N];
    10 int n,block;
    11 vector <int> vec[M];
    12 template <class T>
    13 void read(T& x){
    14     x = 0;
    15     int f = 1 ;
    16     char c = getchar();
    17     while( !isdigit(c) ){
    18         if ( c=='-' ) f = -1 ;
    19         c = getchar();
    20     }
    21     while( isdigit(c) ){
    22         x = x * 10 + c-'0';
    23         c = getchar();
    24     }
    25     x = x*f;
    26 }
    27 inline void reset(int No){
    28     vec[No].clear();
    29     for(int i=(No-1)*block+1;i<=min(No*block,n);i++)
    30         vec[No].push_back(a[i]);
    31     sort( vec[No].begin(),vec[No].end() );
    32 }
    33 inline void modify(int x,int y,int c){
    34     int p = pos[x] , q = pos[y] ;
    35     //同一块内
    36     if( p == q ){
    37         for(int i=x;i<=y;i++)
    38             a[i] += c ;
    39         reset(p);
    40     }else{
    41         for(int i=x;i<=pos[x]*block;i++)
    42             a[i] += c;
    43         reset(pos[x]);
    44 
    45         for(int i=(pos[y]-1)*block+1;i<=y;i++)
    46             a[i] += c;
    47         reset(pos[y]);
    48 
    49         for(int i=pos[x]+1;i<=pos[y]-1;i++){
    50             add[i] += c ;
    51         }
    52     }
    53 }
    54 inline int query(int x,int y,int c){
    55     int p = pos[x] , q = pos[y] ;
    56     int ans = 0 ;
    57     //同一块内
    58     if( p == q ){
    59         for(int i=x;i<=y;i++)
    60             if( a[i] + add[p] < c ) ans ++ ;
    61     }else{
    62         for(int i=x;i<=pos[x]*block;i++){
    63             if( a[i] + add[p] < c ) ans ++ ;
    64         }
    65         for(int i=(pos[y]-1)*block+1;i<=y;i++){
    66             if( a[i] + add[q] < c ) ans ++ ;
    67         }
    68         for(int i=pos[x]+1;i<=pos[y]-1;i++){
    69             ans += lower_bound(vec[i].begin(),vec[i].end(),c-add[i]) - vec[i].begin();
    70         }
    71     }
    72     return ans ;
    73 }
    74 int main()
    75 {
    76     read(n);
    77     //printf("%d
    ",n);
    78     block = (int) sqrt(n);
    79     for(int i=1;i<=n;i++) read(a[i]);
    80     for(int i=1;i<=n;i++){
    81         pos[i] = (i-1) / block + 1 ;
    82         vec[pos[i]].push_back(a[i]);
    83     }
    84     for(int i=1;i<=pos[n];i++)
    85         sort(vec[i].begin(),vec[i].end());
    86     int opt , x , y , c ;
    87     for(int i=1;i<=n;i++){
    88         read(opt),read(x),read(y),read(c);
    89         if( opt == 0 ){
    90             modify(x,y,c);
    91         }else{
    92             printf("%d
    ",query(x,y,c*c));
    93         }
    94     }
    95     return 0 ;
    96 }
    #2
     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cctype>
     4 #include<vector>
     5 #include<algorithm>
     6 using namespace std;
     7 const int N = 1e5+100;
     8 const int M = 1005;
     9 int a[N],pos[N],add[N];
    10 int n,block;
    11 vector <int> vec[M];
    12 template <class T>
    13 void read(T& x){
    14     x = 0;
    15     int f = 1 ;
    16     char c = getchar();
    17     while( !isdigit(c) ){
    18         if ( c=='-' ) f = -1 ;
    19         c = getchar();
    20     }
    21     while( isdigit(c) ){
    22         x = x * 10 + c-'0';
    23         c = getchar();
    24     }
    25     x = x*f;
    26 }
    27 inline void reset(int No){
    28     vec[No].clear();
    29     for(int i=(No-1)*block+1;i<=min(No*block,n);i++)
    30         vec[No].push_back(a[i]);
    31     sort( vec[No].begin(),vec[No].end() );
    32 }
    33 inline void modify(int x,int y,int c){
    34     int p = pos[x] , q = pos[y] ;
    35     //同一块内
    36     if( p == q ){
    37         for(int i=x;i<=y;i++)
    38             a[i] += c ;
    39         reset(p);
    40     }else{
    41         for(int i=x;i<=pos[x]*block;i++)
    42             a[i] += c;
    43         reset(pos[x]);
    44 
    45         for(int i=(pos[y]-1)*block+1;i<=y;i++)
    46             a[i] += c;
    47         reset(pos[y]);
    48 
    49         for(int i=pos[x]+1;i<=pos[y]-1;i++){
    50             add[i] += c ;
    51         }
    52     }
    53 }
    54 inline int query(int x,int y,int c){
    55     int p = pos[x] , q = pos[y] ;
    56     int ans = -1 , tmp ;
    57     //同一块内
    58     if( p == q ){
    59         for(int i=x;i<=y;i++)
    60             if( a[i] + add[p] < c ) ans = max(ans,a[i]+add[p]);
    61     }else{
    62         for(int i=x;i<=pos[x]*block;i++){
    63             if( a[i] + add[p] < c ) ans = max(ans,a[i]+add[p]) ;
    64         }
    65         for(int i=(pos[y]-1)*block+1;i<=y;i++){
    66             if( a[i] + add[q] < c ) ans = max(ans,a[i]+add[q]);
    67         }
    68         for(int i=pos[x]+1;i<=pos[y]-1;i++){
    69             tmp = lower_bound(vec[i].begin(),vec[i].end(),c-add[i]) - vec[i].begin();
    70             if( tmp != 0 ){
    71                 ans = max(ans,vec[i][tmp-1]+add[i]);
    72             }
    73         }
    74     }
    75     return ans ;
    76 }
    77 int main()
    78 {
    79     read(n);
    80     //printf("%d
    ",n);
    81     block = (int) sqrt(n);
    82     for(int i=1;i<=n;i++) read(a[i]);
    83     for(int i=1;i<=n;i++){
    84         pos[i] = (i-1) / block + 1 ;
    85         vec[pos[i]].push_back(a[i]);
    86     }
    87     for(int i=1;i<=pos[n];i++)
    88         sort(vec[i].begin(),vec[i].end());
    89     int opt , x , y , c ;
    90     for(int i=1;i<=n;i++){
    91         read(opt),read(x),read(y),read(c);
    92         if( opt == 0 ){
    93             modify(x,y,c);
    94         }else{
    95             printf("%d
    ",query(x,y,c));
    96         }
    97     }
    98     return 0 ;
    99 }
    #3
    #include<iostream>
    #include<cctype>
    #include<cstdio>
    #include<cmath>
    #define ll long long
    using namespace std;
    
    const int N = 5e4+50;
    ll add[N],sum[N],a[N];
    int pos[N],L[N],R[N];
    int n,block;
    int opt,l,r,c;
    
    inline int read (){
        int x = 0 , f = 1 ;
        char c = getchar() ;
        while( !isdigit(c) ){
            if( c == '-' ) f = -1 ;
            c = getchar();
        }
        while( isdigit(c) ){
            x = ((x << 1) + (x << 3)) + c - '0';
            c = getchar();
        }
        return x * f ;
    }
    inline void Modify(int l,int r,int c){
        int p = pos[l] , q = pos[r];
        if( p==q ){
            for(int i = l ; i <= r ;i++ ) a[i] += c ;
            sum[p] += (r-l+1)*c;
        }else{
            for(int i=l;i<=R[p];i++) a[i] += c;
            sum[p] += (R[p]-l+1) * c ;
            for(int i=L[q];i<=r;i++) a[i] += c;
            sum[q] += (r-L[q]+1) * c ;
    
            for(int i=p+1;i<=q-1;i++) add[i] += c ;
        }
    }
    
    inline ll Query(int l,int r,int mod){
        int p = pos[l] , q = pos[r];
        ll ans = 0 ;
        if( p==q ){
            for(int i=l;i<=r;i++)
                ans = ( ans + a[i] ) % mod ;
            ans = ( ans + (r-l+1) * add[q] ) % mod ;
        }else{
            for(int i=l;i<=R[p];i++) ans = ( ans + a[i] ) % mod ;
            ans = ( ans + (R[p]-l+1) * add[p] ) % mod ;
            for(int i=L[q] ; i<=r ;i++ ) ans = ( ans + a[i] ) %mod ;
            ans = ( ans + (r-L[q]+1) * add[q] ) % mod ;
    
            for(int i=p+1;i<=q-1;i++)
                ans = ( ans + sum[i] + (R[i]-L[i]+1)*add[i] ) %mod ;
    
        }
        return ans % mod ;
    }
    int main()
    {
        n = read() ;    block = sqrt(n) ;
        for(int i=1;i<=n;i++)  a[i] = read();
    
        for(int i=1;i<=block;i++){
            L[i] = (i-1) * block + 1 ;
            R[i] = i * block ;
        }
        if( R[block] < n ){
            block ++ ;
            L[block] = R[block-1] + 1 ;
            R[block] = n ;
        }
    
        for(int i=1;i<=block;i++){
            for(int j=L[i];j<=R[i];j++){
                pos[j] = i ;
                sum[i] += a[j];
            }
        }
        for(int i=1;i<=n;i++){
            opt = read() , l = read() ,r = read() ,c = read();
            if ( !opt ) Modify(l,r,c);
            else    cout << Query(l,r,c+1) << endl ;
        }
        return 0 ;
    }
    #4
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N = 5e4+100;
     5 int L[N],R[N],pos[N],vis[N];
     6 int sum[N],a[N];
     7 int n,block,opt,l,r,c;
     8 
     9 template <class T>
    10 void read ( T & x ){
    11     x = 0 ;
    12     int f = 1 ;
    13     char c = getchar( );
    14     while ( !isdigit(c) ){
    15         if ( c=='-' ) f = -1;
    16         c = getchar();
    17     }
    18     while ( isdigit(c) ){
    19         x = ( (x<<3) + (x<<1) ) + c-'0' ;
    20         c = getchar();
    21     }
    22     x = x * f ;
    23 }
    24 
    25 void check_sqrt(int No){
    26     if( vis[No] ) return ;
    27     vis[No] = 1 ;
    28     sum[No] = 0 ;
    29     for(int i=L[No];i<=R[No];i++){
    30         a[i] = (int)sqrt(a[i]);
    31         sum[No] += a[i];
    32         if( a[i] > 1 )
    33             vis[No] = 0 ;
    34     }
    35 }
    36 inline void Modify(int l,int r){
    37     int p = pos[l] , q = pos[r] ;
    38     if( p == q ){
    39         for(int i=l;i<=r;i++){
    40             sum[p] -= a[i] ;
    41             a[i] = (int)sqrt(a[i]);
    42             sum[p] += a[i];
    43         }
    44     }else{
    45         for(int i=l;i<=R[p];i++){
    46             sum[p] -= a[i] ;
    47             a[i] = (int)sqrt(a[i]);
    48             sum[p] += a[i];
    49         }
    50         for(int i=L[q];i<=r;i++){
    51             sum[q] -= a[i] ;
    52             a[i] = (int)sqrt(a[i]);
    53             sum[q] += a[i];
    54         }
    55         for(int i=p+1;i<=q-1;i++)   check_sqrt(i);
    56     }
    57 }
    58 inline ll Query(int l,int r ){
    59     int p = pos[l] , q = pos[r] ;
    60     ll ans = 0 ;
    61     if ( p==q ) {
    62         for(int i=l;i<=r;i++) ans += a[i];
    63     }else{
    64         for(int i=l;i<=R[p];i++) ans += a[i] ;
    65         for(int i=L[q];i<=r;i++) ans += a[i] ;
    66         for(int i=p+1;i<=q-1;i++){
    67             ans += sum[i] ;
    68         }
    69     }
    70     return ans ;
    71 }
    72 int main()
    73 {
    74     read(n);block = sqrt(n);
    75     for(int i=1;i<=n;i++) read(a[i]) ;
    76     for(int i=1;i<=block;i++){
    77         L[i] = (i-1)*block + 1 ;
    78         R[i] = i * block ;
    79     }
    80     if ( R[block] < n ) {
    81         block ++ ;
    82         L[block] = R[block-1] + 1 ;
    83         R[block] = n ;
    84     }
    85     for(int i=1;i<=block;i++){
    86         for(int j=L[i];j<=R[i];j++){
    87             pos[j] = i ;
    88             sum[i] += a[j];
    89         }
    90     }
    91     for(int i=1;i<=n;i++){
    92         read(opt),read(l),read(r),read(c);
    93         if( !opt ) Modify(l,r);
    94         else printf("%lld
    ",Query(l,r));
    95     }
    96 }
    #5
     1 #include<bits/stdc++.h>
     2 #define Mp make_pair
     3 #define F first
     4 #define S second
     5 using namespace std;
     6 const int N = 1e5+100;
     7 const int M = 10005;
     8 typedef pair<int,int> PII;
     9 int n,a[N],k,m;
    10 int s[N<<1];
    11 int opt,L,R,c;
    12 vector<int>Vec[M];
    13 template <class T>
    14 void read( T &x ){
    15     x = 0 ;
    16     int f = 1 ;
    17     char c = getchar() ;
    18     while( !isdigit(c) ){
    19         if( c=='-' ) f = -1 ;
    20         c = getchar() ;
    21     }
    22     while( isdigit(c) ){
    23         x = x*10 + c-'0';
    24         c = getchar();
    25     }
    26     x = x * f;
    27 }
    28 PII Query(int x){
    29     int No = 1  ;
    30     while ( x > (int) Vec[No].size() ){
    31         x -= (int) Vec[No].size();
    32         No++;
    33     }
    34     return Mp(No,x-1);
    35 }
    36 void rebuild(){
    37     int cnt = 0 ;
    38     for(int i=1;i<=m;i++){
    39         int sz = Vec[i].size();
    40         for(int j=0;j<sz;j++)
    41             s[ ++cnt ] = Vec[i][j] ;
    42         Vec[i].clear();
    43     }
    44     k = sqrt(cnt) ;
    45     m = (cnt-1)/k + 1 ;
    46     for(int i=1;i<=cnt;i++){
    47         Vec[(i-1)/k+1].push_back( s[i] );
    48     }
    49 }
    50 void Modify(int L,int R){
    51     PII x = Query(L);
    52     int f = x.F;
    53     int s = x.S;
    54     Vec[f].insert(Vec[f].begin()+s,R);
    55     if( (int) Vec[f].size() > 20 * k )
    56         rebuild();
    57 }
    58 int main()
    59 {
    60     read(n); k = sqrt(n) ;
    61     for(int i=1;i<=n;i++){
    62         read(a[i]);
    63         Vec[(i-1)/k+1].push_back(a[i]);
    64     }
    65     m = (n-1)/k+1;
    66 
    67     for(int i=1;i<=n;i++){
    68         read(opt),read(L),read(R),read(c);
    69         if( !opt ){
    70             Modify(L,R);
    71         }else{
    72             PII tmp = Query(R);
    73             printf("%d
    ",Vec[tmp.F][tmp.S]);
    74         }
    75     }
    76     return 0 ;
    77 }
    #6
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N = 1e5+10;
     4 const int M = 1e3+100;
     5 const int mod = 10007;
     6 typedef long long ll;
     7 int L[M],R[M],pos[N];
     8 ll a[N],mul[M],add[M];
     9 int n,block;
    10 int opt,l,r,c;
    11 
    12 template <class T>
    13 inline void read( T& x ){
    14     x = 0 ;
    15     int f = 1 ;
    16     char c = getchar();
    17     while( !isdigit(c) ){
    18         if ( c=='-' ) f = -1 ;
    19         c = getchar();
    20     }
    21     while( isdigit(c) ){
    22         x = ( (x<<1) + (x<<3) ) + c-'0';
    23         c = getchar();
    24     }
    25     x = x*f ;
    26 }
    27 
    28 inline void reset(int No){
    29     for(int i=(No-1)*block+1;i<=min(No*block,n);i++){
    30         a[i] = ( a[i] * mul[No] + add[No]) % mod ;
    31     }
    32     add[No] = 0 ;
    33     mul[No] = 1 ;
    34 }
    35 inline void Modify(int opt,int l,int r,ll c ){
    36     int p = pos[l], q = pos[r];
    37     if( p == q ){
    38         reset( p );
    39         for(int i=l;i<=r;i++){
    40             if(!opt) a[i] = (a[i] + c ) % mod;
    41             else a[i] = (a[i] * c ) % mod ;
    42         }
    43     }else{
    44         reset( p );
    45         for(int i=l;i<=block*p;i++){
    46             if(!opt) a[i] = (a[i] + c ) % mod;
    47             else a[i] = (a[i] * c ) % mod ;
    48         }
    49         reset( q );
    50         for(int i=(q-1)*block+1;i<=r;i++){
    51             if(!opt) a[i] = (a[i] + c ) % mod;
    52             else a[i] = (a[i] * c ) % mod ;
    53         }
    54         for(int i=p+1;i<=q-1;i++){
    55             if(!opt) add[i] = ( add[i] + c ) % mod ;
    56             else {
    57                 add[i] = (add[i]*c) % mod ;
    58                 mul[i] = (mul[i]*c) % mod ;
    59             }
    60         }
    61     }
    62 }
    63 int main()
    64 {
    65     read(n); block = sqrt(n);
    66     for(int i=1;i<=n;i++) {
    67         read(a[i]);
    68         pos[i] = (i-1)/block + 1 ;
    69     }
    70     for(int i=1;i<=pos[n];i++) mul[i] = 1 ;
    71     /*
    72     for(int i=1;i<=block;i++){
    73         L[i] = (i-1)*block + 1 ;
    74         R[i] = i*block;
    75     }
    76     if( R[block] < n ){
    77         block ++;
    78         L[block] = R[block] + 1 ;
    79         R[block] = n ;
    80     }
    81     for(int i=1;i<=block;i++){
    82         for(int j=L[i];j<=R[i];j++)
    83             pos[j] = i ;
    84         mul[i] = 1 ;
    85     }
    86     */
    87     for(int i=1;i<=n;i++){
    88         read(opt),read(l),read(r),read(c);
    89         if( opt == 2 )
    90             printf("%lld
    ",1ll * (a[r] * mul[pos[r]] + add[pos[r]]) %mod  ) ;
    91         else
    92             Modify( opt,l,r,c);
    93     }
    94     return 0;
    95 }
    #7
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N = 1e5+10;
     5 int vis[N],a[N],pos[N];
     6 int n,block;
     7 int l,r,c;
     8 template <class T>
     9 void read( T &x ){
    10     x = 0 ;
    11     int f = 1 ;
    12     char c = getchar();
    13     while( !isdigit(c) ){
    14         if ( c=='-' ) f = -1 ;
    15         c = getchar() ;
    16     }
    17     while( isdigit(c) ){
    18         x = ( (x<<1) + (x<<3) ) + c - '0' ;
    19         c = getchar() ;
    20     }
    21     x = x * f;
    22 }
    23 
    24 void reset(int No){
    25     if( vis[No] == -1 ){
    26         //puts("****");
    27         return ;
    28     }
    29     for(int i=(No-1)*block+1;i<=min(No*block,n);i++){
    30         a[i] = vis[No] ;
    31     }
    32     vis[No] = -1 ;
    33 }
    34 
    35 int solve(int L,int R,int c ){
    36     int p = pos[L] , q = pos[R] ;
    37     int ans = 0 ;
    38     if( p == q ){
    39         reset(p) ;
    40         for(int i=L;i<=R;i++){
    41             if( a[i] == c ) ans ++ ;
    42             else a[i] = c ;
    43         }
    44 
    45     }else{
    46         reset(p) ;
    47         for(int i=L;i<=p*block;i++){
    48             if( a[i] == c ) {
    49                 ans ++ ;
    50                 //printf("#
    ");
    51             }
    52             else a[i] = c ;
    53         }
    54 
    55         reset(q) ;
    56         for(int i=(q-1)*block+1;i<=R;i++){
    57             if( a[i] == c ) {
    58                 ans ++ ;
    59                 //printf("(%d ,%d) $
    ",i,a[i]);
    60             }
    61             else a[i] = c ;
    62         }
    63 
    64         for(int i=p+1;i<=q-1;i++){
    65             if( vis[i] != -1  ){
    66                 if( vis[i] == c )
    67                     ans += block ;
    68 
    69             }else{
    70                 for(int j=(i-1)*block+1;j<=i*block;j++){
    71                     if( a[j] != c ) a[j] = c ;
    72                     else ans ++ ;
    73                 }
    74             }
    75             vis[i] = c ;
    76         }
    77     }
    78     return ans ;
    79 }
    80 int main(){
    81     memset(vis,-1,sizeof vis );
    82     read(n); block = (int)sqrt(n);
    83     //printf("@@@%d
    ",block);
    84     for(int i=1;i<=n;i++){
    85         read(a[i]);
    86 
    87         pos[i] = (i-1)/block + 1 ;
    88         //printf("#%d#",pos[i]);
    89     }
    90 
    91     for(int i=1;i<=n;i++){
    92         read(l),read(r),read(c);
    93         printf("%d
    ",solve(l,r,c));
    94     }
    95     return 0 ;
    96 }
    #8
     1 #include<map>
     2 #include<cmath>
     3 #include<cstdio>
     4 #include<vector>
     5 #include<cstring>
     6 #include<algorithm>
     7 #define all(d) (d).begin(),(d).end()
     8 #define U_b upper_bound
     9 #define L_b lower_bound
    10 using namespace std;
    11 const int N = 1e5+100;
    12 const int M = 1005;
    13 int f[M][M];
    14 int a[N],pos[N];
    15 int val[N],cnt[N];
    16 int n,l,r,t,id;
    17 map<int,int>Mp;
    18 vector<int> v[N];
    19 template <class T>
    20 void read(T &x ){
    21     x = 0 ;
    22     int f = 1 ;
    23     char c = getchar();
    24     while( !isdigit(c) ){
    25         if ( c=='-' ) f = -1 ;
    26         c = getchar();
    27     }
    28     while( isdigit(c) ){
    29         x = ( (x<<1) + (x<<3) ) + c - '0' ;
    30         c = getchar();
    31     }
    32     x = x * f;
    33 }
    34 
    35 inline void pre(int No){
    36     memset( cnt, 0 ,sizeof cnt );
    37     int maxz = 0 ;
    38     int ans = 0 ;
    39 
    40     for(int i=(No-1)*t+1;i<=n;i++){
    41         cnt[a[i]] ++ ;
    42         if( cnt[a[i]] > maxz || ( cnt[a[i]] == maxz && val[a[i]]<val[ans]))
    43             ans = a[i] , maxz = cnt[a[i]];
    44         f[No][pos[i]] = ans ;
    45     }
    46 }
    47 
    48 inline int query_cnt(int L,int R,int x){
    49     int k = U_b( all(v[x]),R) - L_b(all(v[x]),L);
    50     return k ;
    51 }
    52 inline int query(int l,int r){
    53     int ans , maxz ;
    54     ans = f[pos[l]+1][pos[r]-1];
    55     maxz = query_cnt ( l,r,ans );
    56     for(int i=l;i<=min(pos[l]*t,r);i++){
    57         int k = query_cnt( l ,r , a[i] ) ;
    58         if( k > maxz || ( k == maxz && val[a[i]]<val[ans]))
    59             ans = a[i] , maxz = k ;
    60     }
    61     if( pos[l] != pos[r] ){
    62         for( int i=(pos[r]-1)*t+1;i<=r;i++){
    63             int k = query_cnt( l ,r , a[i] ) ;
    64             if( k > maxz || ( k == maxz && val[a[i]]<val[ans]))
    65                 ans = a[i] , maxz = k ;
    66         }
    67     }
    68     return ans ;
    69 }
    70 int main()
    71 {
    72     read(n) ;t = 170 ;
    73     for( int i=1;i<=n;i++) {
    74         read(a[i]);
    75         if( !Mp[a[i]]){
    76             Mp[a[i]] = i ;
    77             val[i] = a[i];
    78             id ++ ;
    79         }
    80         a[i] = Mp[a[i]];
    81         v[a[i]].push_back(i);
    82     }
    83 
    84     for(int i=1;i<=n;i++)
    85         pos[i] = (i-1)/t + 1;
    86     for(int i=1;i<=pos[n];i++)
    87         pre(i);
    88     for(int i=1;i<=n;i++){
    89         read(l),read(r);
    90         if( l > r ) swap(l,r);
    91         printf("%d
    ",val[query(l,r)]);
    92     }
    93     return 0;
    94 }
    #9
      1 // luogu-judger-enable-o2
      2 #include<cmath>
      3 #include<vector>
      4 #include<cctype>
      5 #include<cstdio>
      6 #include<algorithm>
      7 #define all(x) x.begin(),x.end()
      8 #define L_B lower_bound
      9 typedef long long ll;
     10 using namespace std;
     11 const int N = 1e6+5;
     12 const int M = 1e3+5;
     13 int pos[N];
     14 int n,m,block ;
     15 int a[N],add[M];
     16 vector<int> Vec[M] ;
     17 
     18 template < class T >
     19 inline void read( T& x ){
     20     x = 0 ; int f = 1 ;
     21     char c = getchar() ;
     22     while( !isdigit(c) ){
     23         if( c=='-' ) f = -1 ;
     24         c = getchar() ;
     25     }
     26     while( isdigit(c) ){
     27         x = ( (x<<1) + (x<<3) ) + c-'0';
     28         c = getchar() ;
     29     }
     30     x = x * f ;
     31 }
     32 inline void reset(int No){
     33     Vec[No].clear();
     34     for(int i=(No-1)*block+1;i<=min(No*block,n);i++)
     35         Vec[No].push_back(a[i]);
     36     sort( Vec[No].begin(),Vec[No].end() );
     37 }
     38 inline void Modify(int x,int y,int c){
     39     int p = pos[x] , q = pos[y] ;
     40     if( p == q ){
     41         for(int i=x;i<=y;i++)
     42             a[i] += c ;
     43         reset(p);
     44     }else{
     45         for(int i=x;i<=pos[x]*block;i++)
     46             a[i] += c;
     47         reset(pos[x]);
     48 
     49         for(int i=(pos[y]-1)*block+1;i<=y;i++)
     50             a[i] += c;
     51         reset(pos[y]);
     52 
     53         for(int i=pos[x]+1;i<=pos[y]-1;i++){
     54             add[i] += c ;
     55         }
     56     }
     57 }
     58 int Query(int x,int y,int C){
     59 
     60     //printf("### ( %d , %d) ### 
    ",x,y);
     61     int p = pos[x] ;
     62     int q = pos[y] ;
     63     int ans = 0 ;
     64     if( p==q ){
     65         for(int i=x;i<=y;i++){
     66             if( a[i]+add[p] >= C )
     67                 ans ++ ;
     68         }
     69     }else{
     70         //printf("$$$$$$
    ");
     71         for(int i=x;i<=p*block;i++){
     72             //printf("( %d , %d ) 
    " ,i,a[i]+add[p]);
     73             if( a[i]+add[p] >= C ) {
     74                 //printf("+++%d
    ",i);
     75                 ans++;
     76             }
     77         }
     78         for(int i=(q-1)*block+1;i<=y;i++){
     79             //printf("( %d , %d ) 
    " ,i,a[i]+add[p]);
     80             if( a[i]+add[q] >= C ) {
     81                 //printf("+++%d
    ",i);
     82                 ans++;
     83             }
     84         }
     85         for(int i=p+1;i<=q-1;i++){
     86             int tmp = ( Vec[i].end() - L_B(all(Vec[i]),C-add[i] ) );
     87             //printf("LB__%d, %d
    ",add[i],tmp);
     88             ans += tmp;
     89         }
     90     }
     91     return ans ;
     92 }
     93 int main()
     94 {
     95     read(n) , read(m) ;
     96     block = (int)sqrt(n);
     97     for(int i=1;i<=n;i++) {
     98         read(a[i]);
     99         pos[i] = (i-1)/block + 1 ;
    100         Vec[pos[i]].push_back(a[i]);
    101     }
    102 
    103     for(int i=1;i<=pos[n];i++)
    104         sort(all(Vec[i]));
    105 
    106     char opt[5] ;
    107     int l , r , C ;
    108     for(int i=1;i<=m;i++){
    109         scanf("%s%d%d%d",opt,&l,&r,&C);
    110         /*
    111         for(int j=1;j<=n;j++){
    112             printf("%d%c",a[j],j==n?'
    ':' ');
    113         }
    114         for(int j=1;j<=pos[n];j++){
    115             printf("%d%c",add[j],j==pos[n]?'
    ':' ');
    116         }
    117          */
    118         if( opt[0] == 'M' ){
    119             Modify( l, r , C );
    120         }else {
    121             printf("%d
    ",Query(l,r,C));
    122         }
    123     }
    124     return 0 ;
    125 }
    洛谷P2801
  • 相关阅读:
    在ubuntu下复制文件出现权限不够的解决方法
    Ubuntu安装ROS Melodic
    gedit文件操作
    Linux下强制删除文件和权限操作
    VMware Tools 继续运行脚本未能在虚拟机中成功运行 解决方式
    Linux解压命令
    Ubuntu 18.04.4 LTS(Bionic Beaver)安装
    Socket层实现系列 — send()类发送函数的实现
    iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
    iOS7 CookBook精彩瞬间(二)NSSet、通过Subscript访问类成员等
  • 原文地址:https://www.cnblogs.com/Osea/p/11272470.html
Copyright © 2011-2022 走看看