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
  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/ls961006/p/8992013.html
Copyright © 2011-2022 走看看