50pts求调
查看原帖
50pts求调
841638
Igunareo楼主2024/5/11 22:43
#include<bits/stdc++.h>
using namespace std;
int n,q;
int L[1000005],R[1000005];
int num[1000005];
pair<int,int> x[1000005];
int y[1000005];
int tag[1000005];
int gnum;
void up(int l,int r,int p){
	if(num[l]==num[r]){
		for(int i=l;i<=r;i++)x[y[i]].first+=p;
		sort(x+L[num[l]],x+R[num[l]]+1);
		for(int i=L[num[l]];i<=R[num[l]];i++)y[x[i].second]=i;
		return;
	}
	for(int i=num[l]+1;i<=num[r]-1;i++)tag[i]+=p;
	for(int i=l;i<=R[num[l]];i++)x[y[i]].first+=p;
	sort(x+L[num[l]],x+R[num[l]]+1);
	for(int i=L[num[l]];i<=R[num[l]];i++)y[x[i].second]=i;
	for(int i=L[num[r]];i<=r;i++)x[y[i]].first+=p;
	sort(x+L[num[r]],x+R[num[r]]+1);
	for(int i=L[num[r]];i<=R[num[r]];i++)y[x[i].second]=i;
	return;
}
int down(int l,int r,int p){
	if(num[l]==num[r]){
		int ans=0;
		for(int i=l;i<=r;i++)if(x[y[i]].first+tag[num[l]]>=p)ans++;
		return ans;
	}
	int ans=0;
	for(int i=l;i<=R[num[l]];i++)if(x[y[i]].first+tag[num[l]]>=p)ans++;
	for(int i=L[num[r]];i<=r;i++)if(x[y[i]].first+tag[num[r]]>=p)ans++;
	for(int i=num[l]+1;i<=num[r]-1;i++){
		int fl=L[i],fr=R[i];
		while(fl<fr){
			int mid=(fl+fr)/2;
			if(x[y[mid]].first+tag[i]>=p)fr=mid;
			else fl=mid+1;
		}
		ans+=R[i]-fl+1;
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&x[i].first);
		x[i].second=i;
	}
	gnum=sqrt(n);
	for(int i=1;i<=gnum;i++){
		L[i]=R[i-1]+1;
		R[i-1]=L[i]+sqrt(n);
	}
	if(gnum*sqrt(n)!=n){
		gnum++;
		L[gnum]=R[gnum]+1;
		R[gnum]=n;
	}
	for(int i=1;i<=gnum;i++){
		for(int j=L[i];j<=R[i];j++)num[j]=i;
		sort(x+L[i],x+R[i]+1);
		for(int j=L[i];j<=R[i];j++)y[x[j].second]=j;
	}
	while(q--){
		char in[2];
		cin>>in[1];
		int l,r,p;
		scanf("%d%d%d",&l,&r,&p);
		if(in[1]=='M')up(l,r,p);
		else printf("%d\n",down(l,r,p));
	}
	return 0;
 } 
2024/5/11 22:43
加载中...