求助!半绿半红
查看原帖
求助!半绿半红
353112
WTR2007楼主2021/7/22 17:44
#include<bits/stdc++.h>
using namespace std;
inline long long int read(){
	int f=1;
	long long int w=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		w=(w<<1)+(w<<3)+(ch-48);
		ch=getchar();
	}
	return w*f;
}
long long int a[1010050],b[1010050],c,d[1015],l,l1,r1,r;
void check1(char cnt){
	if(cnt=='M'){
		for(int i=l;i<=r;i++){
			a[i]+=c;
		}
		l1=1000*(l/1000);
		l=1000*(l/1000+1)-1;
		sort(b+l1,b+l);
	}
	else{
		int ans=0,x=l/1000+1;
		for(int i=l;i<=r;i++){
			if(a[i]+d[x]>=c) ans++;
		}
		cout<<ans<<endl;
	}
}
void check2(char cnt){
	int l1=1000*(l/1000+1)-1,r1=(r/1000)*1000;
	if(cnt=='M'){
		for(int i=l;i<=l1;i++){
			a[i]+=c;
		}
		sort(b+(l/1000)*1000,b+l1);
		for(int i=r1;i<=r;i++){
			a[i]+=c;
		}
		sort(b+r1,b+(r/1000+1)*1000-1);
		for(int i=l/1000+2;i<=r/1000;i++) d[i]+=c;
	}
	else{
		int x=l/1000+1;
		long long int ans=0;
		for(int i=l;i<=l1;i++){
			if(a[i]+d[x]>=c) ans++; 
		}
		int y=r/1000+1;
		for(int i=r1;i<=r;i++){
			if(a[i]+d[y]>=c) ans++;
		}
		for(int i=x+1;i<y;i++){
			int c1=c-d[i],e=(i-1)*1000,k=i*1000-1;
			if(e==0) e++;
			for(int j=e;j<=k;j++){
				if(a[j]>=c1){
					ans=ans+i*1000-j+1;
					break;
				}
			}
		}
		cout<<ans<<endl;
	}
}
int main(){
	long long int n,q,k,t;
	n=read();q=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		b[i]=a[i];
	}
	for(int i=1;i<=n/1000+1;i++){
		if(i>1) sort(b+1000*(i-1),b+1000*i-1);
		else sort(b+1,b+999);
	}
	char tmp;
	for(int i=1;i<=q;i++){
		cin>>tmp;
		l=read();r=read();c=read();
		if(l/1000==r/1000) check1(tmp);
		else check2(tmp);
	}
	return 0;
}
2021/7/22 17:44
加载中...