zoukankan      html  css  js  c++  java
  • 省赛训练 分块9题

    题目链接:https://loj.ac/problems/search?keyword=%E5%88%86%E5%9D%97

    分块入门的9道题,7题,之后再补。

    第一题:

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int belong[50005],l[50005],r[50005];
     6 int number,block;
     7 int n;
     8 int a[50005];
     9 int up[50005];
    10 void build(){
    11     block=sqrt(n);
    12     number=(n-1)/block+1;
    13     for(int i=1;i<=number;i++){
    14         l[i]=(i-1)*block+1;
    15         r[i]=i*block;
    16     }
    17     r[number]=n;
    18     for(int i=1;i<=n;i++){
    19         belong[i]=(i-1)/block+1;
    20     }
    21     memset(up,0,sizeof(up));
    22 }
    23 void update(int ll,int rr,int c){
    24     if(belong[ll]==belong[rr]){
    25         for(int i=ll;i<=rr;i++){
    26             a[i]+=c;
    27         }
    28         return ;
    29     }
    30     for(int i=ll;i<=r[belong[ll]];i++){
    31         a[i]+=c;
    32     }
    33     for(int i=l[belong[rr]];i<=rr;i++){
    34         a[i]+=c;
    35     }
    36     for(int i=belong[ll]+1;i<belong[rr];i++){
    37         up[i]+=c;
    38     }
    39     return;
    40 }
    41 int main(){
    42     ios::sync_with_stdio(false);
    43     cin.tie(0);
    44     cin>>n;
    45     for(int i=1;i<=n;i++){
    46         cin>>a[i];
    47     }
    48     build();
    49     int op,ll,rr,c;
    50     for(int i=1;i<=n;i++){
    51        cin>>op>>ll>>rr>>c;
    52         if(op==0){
    53             update(ll,rr,c);
    54         }
    55         else {
    56             cout<<a[rr]+up[belong[rr]]<<endl;
    57         }
    58     }
    59     return 0;
    60 }
    View Code

    第二题:

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 int belong[50005],l[50005],r[50005];
      6 int number,block;
      7 int n;
      8 long long a[50005];
      9 long long up[50005];
     10 vector<long long>G[50005];
     11 void change(int x){
     12     G[x].clear();
     13     for(int i=l[x];i<=r[x];i++){
     14         G[x].push_back(a[i]);
     15     }
     16     sort(G[x].begin(),G[x].end());
     17 }
     18 void build(){
     19     block=sqrt(n);
     20     number=(n-1)/block+1;
     21     for(int i=1;i<=number;i++){
     22         l[i]=(i-1)*block+1;
     23         r[i]=i*block;
     24     }
     25     r[number]=n;
     26     for(int i=1;i<=n;i++){
     27         belong[i]=(i-1)/block+1;
     28     }
     29     memset(up,0,sizeof(up));
     30     for(int i=1;i<=number;i++){
     31        change(i);
     32     }
     33 }
     34 void update(int ll,int rr,int c){
     35     if(belong[ll]==belong[rr]){
     36         for(int i=ll;i<=rr;i++){
     37             a[i]+=c;
     38         }
     39         change(belong[ll]);
     40         return ;
     41     }
     42     for(int i=ll;i<=r[belong[ll]];i++){
     43         a[i]+=c;
     44     }
     45     change(belong[ll]);
     46     for(int i=l[belong[rr]];i<=rr;i++){
     47         a[i]+=c;
     48     }
     49     change(belong[rr]);
     50     for(int i=belong[ll]+1;i<belong[rr];i++){
     51         up[i]+=c;
     52     }
     53     return;
     54 }
     55 int ask(int ll,int rr,long long c){
     56     c=c*c;
     57     int ans=0;
     58     if(belong[ll]==belong[rr]){
     59         for(int i=ll;i<=rr;i++){
     60             if(a[i]+up[belong[ll]]<c){
     61                 ans++;
     62             }
     63         }
     64         return ans;
     65     }
     66     for(int i=ll;i<=r[belong[ll]];i++){
     67         if(a[i]+up[belong[ll]]<c){
     68             ans++;
     69         }
     70     }
     71     for(int i=l[belong[rr]];i<=rr;i++){
     72         if(a[i]+up[belong[rr]]<c){
     73             ans++;
     74         }
     75     }
     76     for(int i=belong[ll]+1;i<belong[rr];i++){
     77         long long x=c-up[i];
     78         ans+=lower_bound(G[i].begin(),G[i].end(),x)-G[i].begin();
     79     }
     80     return ans;
     81 }
     82 int main(){
     83     ios::sync_with_stdio(false);
     84     cin.tie(0);
     85     cin>>n;
     86     for(int i=1;i<=n;i++){
     87         cin>>a[i];
     88     }
     89     build();
     90     int op,ll,rr;
     91     long long c;
     92     for(int i=1;i<=n;i++){
     93        cin>>op>>ll>>rr>>c;
     94         if(op==0){
     95             update(ll,rr,c);
     96         }
     97         else {
     98             cout<<ask(ll,rr,c)<<endl;
     99         }
    100     }
    101     return 0;
    102 }
    View Code

    第三题:

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 int belong[100005],l[100005],r[100005];
      6 int number,block;
      7 int n;
      8 long long a[100005];
      9 long long up[100005];
     10 set<long long>G[100005];
     11 
     12 void build(){
     13     block=sqrt(n);
     14     number=(n-1)/block+1;
     15     for(int i=1;i<=number;i++){
     16         G[i].clear();
     17         l[i]=(i-1)*block+1;
     18         r[i]=i*block;
     19     }
     20     r[number]=n;
     21     for(int i=1;i<=n;i++){
     22         belong[i]=(i-1)/block+1;
     23         G[belong[i]].insert(a[i]);
     24     }
     25     memset(up,0,sizeof(up));
     26 }
     27 void update(int ll,int rr,int c){
     28     if(belong[ll]==belong[rr]){
     29         for(int i=ll;i<=rr;i++){
     30             G[belong[ll]].erase(a[i]);
     31             a[i]+=c;
     32             G[belong[ll]].insert(a[i]);
     33         }
     34         return ;
     35     }
     36     for(int i=ll;i<=r[belong[ll]];i++){
     37         G[belong[ll]].erase(a[i]);
     38         a[i]+=c;
     39         G[belong[ll]].insert(a[i]);
     40     }
     41     for(int i=l[belong[rr]];i<=rr;i++){
     42         G[belong[rr]].erase(a[i]);
     43         a[i]+=c;
     44         G[belong[rr]].insert(a[i]);
     45     }
     46     for(int i=belong[ll]+1;i<belong[rr];i++){
     47         up[i]+=c;
     48     }
     49     return;
     50 }
     51 int ask(int ll,int rr,long long c){
     52     long long ans=-1;
     53     if(belong[ll]==belong[rr]){
     54         for(int i=ll;i<=rr;i++){
     55             if(a[i]+up[belong[ll]]<c){
     56                 ans=max(a[i]+up[belong[ll]],ans);
     57             }
     58         }
     59         return ans;
     60     }
     61     for(int i=ll;i<=r[belong[ll]];i++){
     62         if(a[i]+up[belong[ll]]<c){
     63             ans=max(a[i]+up[belong[ll]],ans);
     64         }
     65     }
     66     for(int i=l[belong[rr]];i<=rr;i++){
     67         if(a[i]+up[belong[rr]]<c){
     68             ans=max(a[i]+up[belong[rr]],ans);
     69         }
     70     }
     71     for(int i=belong[ll]+1;i<belong[rr];i++){
     72         long long x=c-up[i];
     73         set<long long>::iterator it=G[i].lower_bound(x);
     74         if(it==G[i].begin()){
     75             continue;
     76         }
     77         it--;
     78         ans=max(ans,*it+up[i]);
     79     }
     80     return ans;
     81 }
     82 int main(){
     83     ios::sync_with_stdio(false);
     84     cin.tie(0);
     85     cin>>n;
     86     for(int i=1;i<=n;i++){
     87         cin>>a[i];
     88     }
     89     build();
     90     int op,ll,rr;
     91     long long c;
     92     for(int i=1;i<=n;i++){
     93        cin>>op>>ll>>rr>>c;
     94         if(op==0){
     95             update(ll,rr,c);
     96         }
     97         else {
     98             cout<<ask(ll,rr,c)<<endl;
     99         }
    100     }
    101     return 0;
    102 }
    View Code

    第四题:

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int belong[100005],l[100005],r[100005];
     6 long long number,block;
     7 int n;
     8 long long a[100005];
     9 long long up[100005],sum[100005];
    10 set<long long>G[100005];
    11 
    12 void build(){
    13     block=sqrt(n);
    14     number=(n-1)/block+1;
    15     for(int i=1;i<=number;i++){
    16         G[i].clear();
    17         l[i]=(i-1)*block+1;
    18         r[i]=i*block;
    19     }
    20     r[number]=n;
    21     memset(up,0,sizeof(up));
    22     memset(sum,0,sizeof(sum));
    23     for(int i=1;i<=n;i++){
    24         belong[i]=(i-1)/block+1;
    25         sum[belong[i]]+=a[i];
    26     }
    27 
    28 }
    29 void update(int ll,int rr,int c){
    30     if(belong[ll]==belong[rr]){
    31         for(int i=ll;i<=rr;i++){
    32             a[i]+=c;
    33             sum[belong[ll]]+=c;
    34         }
    35         return ;
    36     }
    37     for(int i=ll;i<=r[belong[ll]];i++){
    38         a[i]+=c;
    39         sum[belong[ll]]+=c;
    40     }
    41     for(int i=l[belong[rr]];i<=rr;i++){
    42         a[i]+=c;
    43         sum[belong[rr]]+=c;
    44     }
    45     for(int i=belong[ll]+1;i<belong[rr];i++){
    46         up[i]+=c;
    47     }
    48     return;
    49 }
    50 int ask(int ll,int rr,long long c){
    51     c++;
    52     long long ans=0;
    53     if(belong[ll]==belong[rr]){
    54         for(int i=ll;i<=rr;i++){
    55             ans=(ans+a[i])%c;
    56         }
    57         ans=(ans+up[belong[ll]]*(rr-ll+1)%c)%c;
    58         return ans;
    59     }
    60     for(int i=ll;i<=r[belong[ll]];i++){
    61         ans+=a[i]+up[belong[ll]];
    62         ans%=c;
    63     }
    64     for(int i=l[belong[rr]];i<=rr;i++){
    65         ans+=a[i]+up[belong[rr]];
    66         ans%=c;
    67     }
    68     for(int i=belong[ll]+1;i<belong[rr];i++){
    69         ans=((ans+sum[i])%c+up[i]*block%c)%c;
    70     }
    71     return ans;
    72 }
    73 int main(){
    74     ios::sync_with_stdio(false);
    75     cin.tie(0);
    76     cin>>n;
    77     for(int i=1;i<=n;i++){
    78         cin>>a[i];
    79     }
    80     build();
    81     int op,ll,rr;
    82     long long c;
    83     for(int i=1;i<=n;i++){
    84        cin>>op>>ll>>rr>>c;
    85         if(op==0){
    86             update(ll,rr,c);
    87         }
    88         else {
    89             cout<<ask(ll,rr,c)<<endl;
    90         }
    91     }
    92     return 0;
    93 }
    View Code

    第五题:

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 int belong[100005],l[100005],r[100005];
      6 long long number,block;
      7 int n;
      8 long long a[100005];
      9 long long up[100005],sum[100005];
     10 set<long long>G[100005];
     11 
     12 void build(){
     13     block=sqrt(n);
     14     number=(n-1)/block+1;
     15     for(int i=1;i<=number;i++){
     16         G[i].clear();
     17         l[i]=(i-1)*block+1;
     18         r[i]=i*block;
     19     }
     20     r[number]=n;
     21     memset(sum,0,sizeof(sum));
     22     for(int i=1;i<=n;i++){
     23         belong[i]=(i-1)/block+1;
     24         sum[belong[i]]+=a[i];
     25     }
     26 
     27 }
     28 int judge(int x){
     29     if(sum[x]==block){
     30         return sum[x];
     31     }
     32     sum[x]=0;
     33     for(int i=l[x];i<=r[x];i++){
     34         a[i]=sqrt(a[i]);
     35         sum[x]+=a[i];
     36     }
     37     return sum[x];
     38 
     39 }
     40 void update(int ll,int rr,int c){
     41     if(belong[ll]==belong[rr]){
     42         for(int i=ll;i<=rr;i++){
     43             a[i]=sqrt(a[i]);
     44         }
     45         return ;
     46     }
     47     for(int i=ll;i<=r[belong[ll]];i++){
     48         sum[belong[ll]]-=a[i];
     49         a[i]=sqrt(a[i]);
     50         sum[belong[ll]]+=a[i];
     51     }
     52     for(int i=l[belong[rr]];i<=rr;i++){
     53         sum[belong[rr]]-=a[i];
     54         a[i]=sqrt(a[i]);
     55         sum[belong[rr]]+=a[i];
     56     }
     57     for(int i=belong[ll]+1;i<belong[rr];i++){
     58         if(sum[i]!=block){
     59             sum[i]=0;
     60             for(int j=l[i];j<=r[i];j++){
     61                 a[j]=sqrt(a[j]);
     62                 sum[i]+=a[j];
     63             }
     64         }
     65     }
     66     return;
     67 }
     68 int ask(int ll,int rr,long long c){
     69     long long ans=0;
     70     if(belong[ll]==belong[rr]){
     71         for(int i=ll;i<=rr;i++){
     72             ans+=a[i];
     73         }
     74         return ans;
     75     }
     76     for(int i=ll;i<=r[belong[ll]];i++){
     77         ans+=a[i];
     78     }
     79     for(int i=l[belong[rr]];i<=rr;i++){
     80         ans+=a[i];
     81     }
     82     for(int i=belong[ll]+1;i<belong[rr];i++){
     83         ans+=sum[i];
     84     }
     85     return ans;
     86 }
     87 int main(){
     88     ios::sync_with_stdio(false);
     89     cin.tie(0);
     90     cin>>n;
     91     for(int i=1;i<=n;i++){
     92         cin>>a[i];
     93     }
     94     build();
     95     int op,ll,rr;
     96     long long c;
     97     for(int i=1;i<=n;i++){
     98        cin>>op>>ll>>rr>>c;
     99         if(op==0){
    100             update(ll,rr,c);
    101         }
    102         else {
    103             cout<<ask(ll,rr,c)<<endl;
    104         }
    105     }
    106     return 0;
    107 }
    View Code

    第六题:

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int belong[200005],l[200005],r[200005];
     6 long long number,block;
     7 int n;
     8 long long a[200005];
     9 long long up[200005],sum[200005];
    10 vector<long long>G[200005];
    11 int mx;
    12 void build(int n){
    13     block=sqrt(n);
    14     number=(n-1)/block+1;
    15     for(int i=1;i<=number;i++){
    16         G[i].clear();
    17         l[i]=(i-1)*block+1;
    18         r[i]=i*block;
    19     }
    20     r[number]=n;
    21     for(int i=1;i<=n;i++){
    22         belong[i]=(i-1)/block+1;
    23         G[belong[i]].push_back(a[i]);
    24     }
    25 }
    26 pair<int,int> judge(int x){
    27     int ans=1;
    28     while(x>G[ans].size()){
    29         x-=G[ans].size();
    30         ans++;
    31     }
    32     return make_pair(ans,x-1);
    33 }
    34 void update(int ll,int rr,int c){
    35     pair<int,int>s =judge(ll);
    36     G[s.first].insert(G[s.first].begin()+s.second,rr);
    37     if(G[s.first].size()>mx){
    38         int ans=0;
    39         for(int i=1;i<=number;i++){
    40             for(int j=0;j<G[i].size();j++){
    41                 a[++ans]=G[i][j];
    42             }
    43             G[i].clear();
    44         }
    45         build(ans);
    46     }
    47 }
    48 int main(){
    49     ios::sync_with_stdio(false);
    50     cin.tie(0);
    51     cin>>n;
    52     for(int i=1;i<=n;i++){
    53         cin>>a[i];
    54     }
    55     build(n);
    56     int op,ll,rr;
    57     long long c;
    58     mx=block*10;
    59     for(int i=1;i<=n;i++){
    60        cin>>op>>ll>>rr>>c;
    61         if(op==0){
    62             update(ll,rr,c);
    63         }
    64         else {
    65             pair<int,int> s=judge(rr);
    66             cout<<G[s.first][s.second]<<endl;
    67         }
    68     }
    69     return 0;
    70 }
    View Code

     第七题:

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 int belong[100005],l[100005],r[100005];
      6 int number,block;
      7 int n;
      8 int a[100005];
      9 int up[100005],mu[100005];
     10 int mod=10007;
     11 void build(){
     12     block=sqrt(n);
     13     number=(n-1)/block+1;
     14     l[0]=0;
     15     r[0]=0;
     16     for(int i=1;i<=number;i++){
     17         l[i]=r[i-1]+1;
     18         r[i]=r[i-1]+block;
     19         mu[i]=1;
     20     }
     21     r[number]=n;
     22     for(int i=1;i<=n;i++){
     23         up[i]=0;
     24         belong[i]=(i-1)/block+1;
     25     }
     26 }
     27 void change(int ll){
     28     int d=belong[ll];
     29     for(int i=l[d];i<=r[d];i++){
     30         a[i]=((a[i]*mu[d]%mod+up[d])%mod+mod)%mod;
     31     }
     32     mu[d]=1;
     33     up[d]=0;
     34 }
     35 void add(int ll,int rr,int c){
     36     c=(c%mod+mod)%mod;
     37     if(belong[ll]==belong[rr]){
     38         change(ll);
     39         for(int i=ll;i<=rr;i++){
     40             a[i]=(a[i]+c)%mod;
     41         }
     42         return ;
     43     }
     44     change(ll);
     45     for(int i=ll;i<=r[belong[ll]];i++){
     46         a[i]=(a[i]+c)%mod;
     47     }
     48     change(rr);
     49     for(int i=l[belong[rr]];i<=rr;i++){
     50         a[i]=(a[i]+c)%mod;
     51     }
     52     for(int i=belong[ll]+1;i<belong[rr];i++){
     53         up[i]=(up[i]+c)%mod;
     54     }
     55 }
     56 void mul(int ll,int rr,int c){
     57     c=(c%mod+mod)%mod;
     58     if(belong[ll]==belong[rr]){
     59         change(ll);
     60         for(int i=ll;i<=rr;i++){
     61             a[i]=(a[i]*c)%mod;
     62         }
     63         return ;
     64     }
     65     change(ll);
     66     for(int i=ll;i<=r[belong[ll]];i++){
     67         a[i]=(a[i]*c)%mod;
     68     }
     69     change(rr);
     70     for(int i=l[belong[rr]];i<=rr;i++){
     71         a[i]=(a[i]*c)%mod;
     72     }
     73     for(int i=belong[ll]+1;i<belong[rr];i++){
     74         up[i]=(up[i]*c)%mod;
     75         mu[i]=(mu[i]*c)%mod;
     76     }
     77 }
     78 int main(){
     79     scanf("%d",&n);
     80     for(int i=1;i<=n;i++){
     81         scanf("%d",&a[i]);
     82         a[i]%=mod;
     83     }
     84     build();
     85     int op,ll,rr;
     86     int c;
     87     for(int i=1;i<=n;i++){
     88        scanf("%d%d%d%d",&op,&ll,&rr,&c);
     89        if(op==0){
     90             add(ll,rr,c);
     91        }
     92        if(op==1){
     93             mul(ll,rr,c);
     94        }
     95        if(op==2){
     96             printf("%d
    ",(a[rr]*mu[belong[rr]]%mod+up[belong[rr]])%mod);
     97        }
     98     }
     99     return 0;
    100 }
    View Code
  • 相关阅读:
    网站推荐:11个相似图片搜索网站(以图找图)
    逻辑回归
    关于估计、偏差以及方差
    算法面试问题集锦
    sql语句执行顺序
    五大算法之动态规划
    五大算法之回溯算法
    操作系统问题总结之处理机调度
    操作系统问题总结之进程管理
    Element-UI 去掉表格边框(表格Hover事件移除)
  • 原文地址:https://www.cnblogs.com/ls961006/p/8992013.html
Copyright © 2011-2022 走看看