本人分块模块化,可读性高,在线求调
查看原帖
本人分块模块化,可读性高,在线求调
707513
LBYYSM_123楼主2023/7/20 13:48
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q;
int a[1000001],bel[1000001];
int st[1001],ed[1001],mark[1001];
vector<int> d[1001];
void build(){
	q=sqrt(n);
	for(int i=1;i<=q;i++)
		st[i]=n/q*(i-1)+1,ed[i]=n/q*i;ed[q]=n;
	for(int i=1;i<=q;i++){
		for(int j=st[i];j<=ed[i];j++)
			bel[j]=i,d[i].push_back(a[j]);
	}
	for(int i=1;i<=q;i++)
		sort(d[i].begin(),d[i].end());
}
void reset(int x){
	while(d[x].empty()!=0) d[x].pop_back();
	for(int i=st[x];i<=ed[x];i++)
		d[x].push_back(a[i]);
	sort(d[x].begin(),d[x].end());
}
void add(int l,int r,int k){
	if(bel[l]==bel[r]){
		for(int i=l;i<=r;i++)
			a[i]+=k;
		reset(bel[l]);
	}
	else{
		for(int i=l;i<=ed[bel[l]];i++)
			a[i]+=k;
		reset(bel[l]);
		for(int i=st[bel[r]];i<=r;i++)
			a[i]+=k;
		reset(bel[r]);
		for(int i=bel[l]+1;i<bel[r];i++)
			mark[i]+=k;
	}
}
int ask(int l,int r,int k){
	int ans=0;
	if(bel[l]==bel[r]){
		for(int i=l;i<=r;i++)
			if(a[i]+mark[bel[l]]>=k)
				ans++;
		return ans;
	}
	else{
		for(int i=l;i<=ed[bel[l]];i++)
			if(a[i]+mark[bel[l]]>=k)
				ans++;
		for(int i=st[bel[r]];i<=r;i++)
			if(a[i]+mark[bel[r]]>=k)
				ans++;
		for(int i=bel[l]+1;i<bel[r];i++){
			int x=k-mark[i];           
        	ans+=lower_bound(d[i].begin(),d[i].end(),x)-d[i].begin();
    	}
    	return ans;
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)	
		cin>>a[i];
	build();
	for(int i=1;i<=m;i++){
		char c;int x,y,z;
		cin>>c>>x>>y>>z;
		if(c=='M') add(x,y,z);
		else cout<<ask(x,y,z)<<endl;
	}
    return 0;
}```
2023/7/20 13:48
加载中...