省赛训练 分块9题

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

分块入门的9道题,今天刷了6道,晚上有课,之后再补。

第一题:

 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

猜你喜欢

转载自www.cnblogs.com/ls961006/p/8992013.html