萌新刚学分块 求助 #9WA
查看原帖
萌新刚学分块 求助 #9WA
590571
_weishiqi66_楼主2024/3/8 12:41

提交记录

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e6;

int n, a[N], v[N];
int l[N], r[N], pos[N];
int add[N];

inline void reset(int x){
	for(int i=l[pos[x]];i<=r[pos[x]];i++) v[i]=a[i];
	sort(v+l[pos[x]],v+1+r[pos[x]]);
}

inline void change(int x,int y,int d) {
	int p=pos[x],q=pos[y];
	if(p==q) {
		for(int i=x;i<=y;i++) a[i]+=d;
		reset(x);
	} 
	else {
		for(int i=p+1;i<=q-1;i++) add[i]+=d;
		for(int i=x;i<=r[p];i++) a[i]+=d;
		for(int i=l[q];i<=y;i++) a[i]+=d;
		reset(x);
		reset(l[q]);
	}
	return ;
}

inline int ef (int l,int r,int x) {
	int rr=r;
	while(l<r) {
		int mid=(l+r)/2;
		if(v[mid]<x) l=mid+1;
		else r=mid;
	}
	if(v[l]<x)  return 0;
	return (rr-l)+1;
} 
inline int ask(int x,int y,int c){
	int p=pos[x],q=pos[y];
	int ans=0;
	if(p==q) {
		for(int i=x;i<=y;i++) if(a[i]+add[p] >= c) ans++;
		return ans;
	}
	else {
		for(int i=p+1;i<=q-1;i++) {
			int find=c-add[i];
			ans+=ef(l[i],r[i],find); 
		}
		for(int i=x;i<=r[p];i++) if(a[i]+add[p] >= c) ans++;
		for(int i=l[q];i<=y;i++) if(a[i]+add[q] >= c) ans++;
		return ans;
	}
}

inline int read(){
	int x=0,f=1;
	char c; c=getchar();
	while(c>'9'||c<'0') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

signed main() {
	int T;
	n=read();T=read();
	for(int i=1;i<=n;i++) {
		a[i]=read();
		v[i]=a[i];
	}
	int t=sqrt(n);
	for(int i=1;i<=t;i++) {
		l[i]=(i-1)*t+1, r[i]=i*t;
		sort(v+l[i],v+r[i]+1);
	}
	if(r[t]<n) { t++; l[t]=r[t-1]+1,r[t]=n; }
	for(int i=1;i<=t;i++) {
		for(int j=l[i];j<=r[i];j++) pos[j]=i;
	}
	
	while(T--) {
		char Q;int x,y,z;
		cin>>Q;
		x=read(); y=read(); z=read();
		if(Q=='M') change(x,y,z);
		else cout<<ask(x,y,z)<<endl;
	}
	return 0;
}
2024/3/8 12:41
加载中...