50pts WA on #6~10 玄关求条
查看原帖
50pts WA on #6~10 玄关求条
934048
ni_ju_ge楼主2025/8/1 11:31
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,M=1e3+5,Inf=-1e9;
struct blk {
	int a[M*2];
	int l,r,tag;
} p[M],pp[M];
int n,q,l,r,x,su;
int h[N];
char opt;
void upd(int pos) {
	pp[pos]=p[pos];
	sort(pp[pos].a+1,pp[pos].a+M+1);
}
int main() {
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>h[i];
	su=(n+M-1)/M;
	for(int i=1;i<=su;i++) {
		if(i!=su) {
			p[i].l=M*(i-1)+1;
			p[i].r=M*i;
			for(int j=p[i].l;j<=p[i].r;j++) p[i].a[j-p[i].l+1]=h[j];
		} else {
			p[i].l=M*(i-1)+1;
			p[i].r=n;
			for(int j=p[i].l;j<=p[i].r;j++) p[i].a[j-p[i].l+1]=h[j];
			for(int j=n+1;j<=M*i;j++) p[i].a[j-p[i].l+1]=Inf;
		}
		upd(i);
	}
	while(q--) {
		cin>>opt>>l>>r>>x;
		if(opt=='M') {
			for(int i=(l-1)/M+1;i<=su;i++) {
				if(p[i].l>r) break;
				if(p[i].l>=l&&p[i].r<=r) p[i].tag+=x;
				else if(l>=p[i].l&&r<=p[i].r) {
					for(int j=l;j<=r;j++) p[i].a[j-p[i].l+1]+=x;
					upd(i);
				}
				else if((r>=p[i].l&&l<=p[i].l)||(l<=p[i].r&&r>=p[i].r)) {
					for(int j=max(l,p[i].l);j<=min(r,p[i].r);j++) p[i].a[j-p[i].l+1]+=x;
					upd(i);
				}
			}
		} else {
			int ans=0;
			for(int i=(l-1)/M+1;i<=su;i++) {
				int lim=x-p[i].tag;
				if(p[i].l>r) break;
				if(p[i].l>=l&&p[i].r<=r) {
					int l=1,r=M,mid,res=M;
					while(l<=r) {
						int mid=(l+r)/2;
						if(pp[i].a[mid]>=lim) r=mid-1;
						else res=mid,l=mid+1;
					}
					ans+=M-res;
				}
				else if(l>=p[i].l&&r<=p[i].r) {
					for(int j=l;j<=r;j++) ans+=(p[i].a[j-p[i].l+1]>=lim);
				}
				else if((r>=p[i].l&&l<=p[i].l)||(l<=p[i].r&&r>=p[i].r)) {
					for(int j=max(l,p[i].l);j<=min(r,p[i].r);j++) ans+=(p[i].a[j-p[i].l+1]>=lim);
				}
			}
			cout<<ans<<endl;
		}
	}
}
2025/8/1 11:31
加载中...