分块wa100pts求调
查看原帖
分块wa100pts求调
1279263
hzc0829楼主2025/1/12 18:47

rt,wa了Subtask #1的第一个点

数据:

input:
100 5
40 7 47 44 52 81 87 60 82 49 40 30 44 90 62 68 81 44 46 17 44 71 89 79 44 95 57 4 6 36 26 61 62 64 14 93 46 35 20 98 55 6 71 9 85 31 1 70 93 100 82 33 57 14 83 56 40 67 27 53 43 39 44 4 59 32 49 72 91 60 67 84 16 64 9 21 59 30 100 34 47 62 10 9 56 88 19 20 16 92 22 11 68 56 62 16 77 94 20 10
M 66 67 1
M 82 97 13
M 14 90 20
M 47 76 7
A 58 86 80
output:
13
我的输出:
12

代码:

#include<bits/stdc++.h>
using namespace std;
int n,q;
int sn,tot;
long long a[1000010],e[1000010];
int belong[1000010];
int _l[1010],_r[1010];
long long add[1010];
void rebuild(int l,int r){
	for(int i=l;i<=r;i++){
		e[i]=a[i];
	}
	sort(e+l,e+r+1);
}
void init(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sn=sqrt(n);
	tot=(n+sn-1)/sn;
	for(int i=1;i<=tot;i++){
		_l[i]=(i-1)*sn+1;
		_r[i]=min(i*sn,n);
		for(int j=_l[i];j<=_r[i];j++){
			belong[j]=i;
		}
		rebuild(_l[i],_r[i]);
	}
}
void modify(int l,int r,int w){
	if(belong[l]==belong[r]){
		for(int i=l;i<=r;i++){
			a[i]+=w;
		}
		rebuild(l,r);
	}else{
		for(int i=l;i<=_r[belong[l]];i++){
			a[i]+=w;
		}
		for(int i=_l[belong[r]];i<=r;i++){
			a[i]+=w;
		}
		rebuild(_l[belong[l]],_r[belong[l]]);
		rebuild(_l[belong[r]],_r[belong[r]]);
		for(int i=belong[l]+1;i<=belong[r]-1;i++){
			add[i]+=w;
		}
	}
}
void ask(int l,int r,int c){
	int ans=0;
	if(belong[l]==belong[r]){
		for(int i=l;i<=r;i++){
			ans+=a[i]+add[belong[i]]>=c;
		}
	}else{
		for(int i=l;i<=_r[belong[l]];i++){
			ans+=a[i]+add[belong[i]]>=c;
		}
		for(int i=_l[belong[r]];i<=r;i++){
			ans+=a[i]+add[belong[i]]>=c;
		}
		for(int i=belong[l]+1;i<=belong[r]-1;i++){
			ans+=e+_r[i]+1-lower_bound(e+_l[i],e+_r[i]+1,c-add[i]);
		}
	}
	cout<<ans<<endl;
}
void solve(){
	while(q--){
		char op;
		int l,r,w;
		cin>>op>>l>>r>>w;
		if(op=='M'){
			modify(l,r,w);
		}else if(op=='A'){
			ask(l,r,w);
		}
	}
}
int main(){
	init();
	solve();
	return 0;
}
2025/1/12 18:47
加载中...