RE#3#4求助
查看原帖
RE#3#4求助
542567
CyberPrisoner楼主2023/2/5 13:33
#include<bits/stdc++.h>
using namespace std; 
const int N=1e6+10;
int n,q,tot;
int id[N],len;
int a[N],b[N],c[N],L[N],R[N];
void add(int l,int r,int x){
	int sid=id[l],eid=id[r];
	if(sid==eid){
		for(int i=l;i<=r;i++){
			a[i]+=x;
		}
		for(int i=L[sid];i<=R[sid];i++){
			c[i]=a[i];
		}
		sort(c+L[sid],c+R[sid]+1);
		return;
	}
	for(int i=l;id[i]==sid;i++)
		a[i]+=x;
	for(int i=L[sid];i<=R[sid];i++)
		c[i]=a[i];
	sort(c+L[sid],c+R[sid]+1);
	for(int i=r;id[i]==eid;i--)
		a[i]+=x;
	for(int i=L[eid];i<=R[eid];i++)
		c[i]=a[i];
	sort(c+L[eid],c+R[eid]+1);
	for(int i=sid+1;i<eid;i++){
		b[i]+=x;
	}
}
int query(int l,int r,int x){
	int ans=0;
	int sid=id[l],eid=id[r];
	if(sid==eid){
		for(int i=l;i<=r;i++){
			if(a[i]+b[sid]>=x)ans++;
		}
		return ans;
	}
	for(int i=l;i<=R[sid];i++){
		if(a[i]+b[sid]>=x)ans++;
	}
	for(int i=r;i>=L[eid];i--){
		if(a[i]+b[eid]>=x)ans++;
	}
	for(int i=sid+1;i<eid;i++){
		if(c[L[i]]+b[i]>=x){
			ans+=len;
			continue;
		}
		int res=lower_bound(c+L[i],c+R[i]+1,x-b[i])-c-L[i];
		//cout<<res<<endl;
		ans+=R[i]-L[i]+1-res;
	}
	return ans;
}
int main(){
	cin>>n>>q;
	tot=len=sqrt(n);
	if(len*len!=n)tot++;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		c[i]=a[i];
		id[i]=(i-1)/len+1;
		if(id[i]!=id[i-1])
		L[id[i]]=i;
		if(i/len+1!=id[i]){
			R[id[i]]=i;
		}
	}
	R[tot]=n;
	for(int i=1;i<=tot;i++)
	sort(c+L[i],c+R[i]+1);
	for(int i=1;i<=q;i++){
		char op;
		int l,r,w;
		cin>>op;
		cin>>l>>r>>w;
		if(op=='M'){	
			add(l,r,w);
		}
		if(op=='A'){
			cout<<query(l,r,w)<<endl; 
		}
	}
	return 0;
}
2023/2/5 13:33
加载中...