求条!90pts
查看原帖
求条!90pts
627732
Fuxh_18楼主2025/1/15 11:27

rt

提交记录

我用的分块,两个 TLE。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6+1;
int n,m,a[N],l[N],r[N],pos[N],add[N],b[1001][1001];
void init(){
	int t=sqrt(n)/2;
	for(int i=1;i<=t;i++){
		l[i]=r[i-1]+1;
		r[i]=i*t*2;
	}
	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++){
			 b[i][j-l[i]+1]=a[j];
		}
		sort(b[i]+1,b[i]+1+r[i]-l[i]+1);
	}
	return;
}
void update(int lc,int rc,int c){
	int p=pos[lc],q=pos[rc];
	if(p==q){
		for(int i=lc;i<=rc;i++){
			a[i]+=c;
		}
		for(int i=l[p];i<=r[p];i++){
			b[p][i-l[p]+1]=a[i];
		}
		sort(b[p]+1,b[p]+1+r[p]-l[p]+1);
	}
	else{
		for(int i=lc;i<=r[p];i++){
			a[i]+=c;
		}
		for(int i=l[p];i<=r[p];i++){
			b[p][i-l[p]+1]=a[i];
		}
		sort(b[p]+1,b[p]+1+r[p]-l[p]+1);
		for(int i=p+1;i<q;i++){
			add[i]+=c;
		}
		for(int i=l[q];i<=rc;i++){
			a[i]+=c;
		}
		for(int i=l[q];i<=r[q];i++){
			b[q][i-l[q]+1]=a[i];
		}
		sort(b[q]+1,b[q]+1+r[q]-l[q]+1);
	}
	return;
}
int query(int lc,int rc,int c){
	int p=pos[lc],q=pos[rc],res=0;
	if(p==q){
		for(int i=lc;i<=rc;i++){
			if(a[i]+add[p]>=c){
				res++;
			}
		}
	}
	else{
		for(int i=lc;i<=r[p];i++){
			if(a[i]+add[p]>=c){
				res++;
			}
		}
		for(int i=p+1;i<q;i++){
			res+=lower_bound(b[i]+1,b[i]+1+r[i]-l[i]+1,c-add[i])-b[i]-1;
		}
		for(int i=l[q];i<=rc;i++){
			if(a[i]+add[p]>=c){
				res++;
			}
		}
	}
	return res;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	init();
	for(int i=1;i<=m;i++){
		int l,r,c;
		char opt;
		cin>>opt>>l>>r>>c;
		if(opt=='M'){
			update(l,r,c);
		}
		else{
			cout<<query(l,r,c)<<endl;
		}
	}
	return 0;
}

如果改成 scanf 和 printf 样例都错了。

2025/1/15 11:27
加载中...