题目链接: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 }
第二题:
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 }
第三题:
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 }
第四题:
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 }
第五题:
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 }
第六题:
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 }
第七题:
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 }