WA 90pts 求调
查看原帖
WA 90pts 求调
1053695
lgx57楼主2024/8/11 11:07
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define pb push_back
using namespace std;
const int N=1e6+5;
int a[N],b[N],add[N];
int B,t,n,q;
int st(int x){
	return (x-1)*B+1;
}
int ed(int x){
	return min(n,x*B);
}
int pos(int x){
	return (x-1)/B+1; 
}
void update(int l,int r,int d){
	if (pos(l)==pos(r)){
		for (int i=l;i<=r;i++){
			a[i]+=d;
			b[i]=a[i];
		}
		sort(b+st(pos(l)),b+ed(pos(l))+1);
		return ;
	}
	else{
		for (int i=pos(l);i<=pos(r);i++){
			if (l>st(i)){
				for (int j=l;j<=ed(i);j++){
					a[j]+=d;
					b[j]=a[j];
				}
				sort(b+st(i),b+ed(i)+1);
			}
			else if (r<ed(i)){
				for (int j=st(i);j<=r;j++){
					a[j]+=d;
					b[j]=a[j];
				}
				sort(b+st(i),b+ed(i)+1);
			}
			else{
				add[i]+=d;
			}
		}
	}
}
int query(int l,int r,int x){
	int ans=0;
	if (pos(l)==pos(r)){
		for (int i=l;i<=r;i++){
			if (a[i]+add[pos(l)]>=x){
				ans++;
			}
		}
		return ans;
	}
	for (int i=pos(l);i<=pos(r);i++){
		if (l>st(i)){
			for (int j=l;j<ed(i);j++){
				if (a[j]+add[i]>=x){
					ans++;
				}
			}
		}
		else if(r<ed(i)){
			for (int j=st(i);j<=r;j++){
				if (a[j]+add[i]>=x) ans++;
			}
		}
		else{
			int l=st(i),r=ed(i);
			if (b[r]+add[i]<x) continue;
			int cnt=lower_bound(b+l,b+r+1,x-add[i])-b;
//			cout<<cnt<<endl;
			ans+=ed(i)-cnt+1;
		}
	}
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	B=sqrt(n);
	t=n/B;
	if (n%B) t++;
	for (int i=1;i<=t;i++){
		sort(b+st(i),b+ed(i)+1);
	}
	while (q--){
		char x;
		cin>>x;
		if (x=='M'){
			int l,r,d;
			cin>>l>>r>>d;
			update(l,r,d);
		}
		else{
			int l,r,c;
			cin>>l>>r>>c;
			cout<<query(l,r,c)<<endl;
		}
	}
	return 0;
}
2024/8/11 11:07
加载中...