100pts Wrong Answer 求调
  • 板块P2801 教主的魔法
  • 楼主linch吃瓜猫
  • 当前回复11
  • 已保存回复11
  • 发布时间2025/8/1 11:15
  • 上次更新2025/8/1 16:35:06
查看原帖
100pts Wrong Answer 求调
737242
linch吃瓜猫楼主2025/8/1 11:15

https://www.luogu.com.cn/record/228137330

:::error[错误代码]{open}

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
const int maxk=1e3+10;
int n,q,a[maxn],s[maxk],t[maxk],b[maxn],belong[maxn],delta[maxk];
void sort_block(int x){
	for(int i=s[x];i<=t[x];i++) b[i]=a[i];
	sort(b+s[x],b+t[x]+1);
}
void update(int l,int r,int x){
	int u=belong[l],v=belong[r];
	if(u==v){
		for(int i=l;i<=r;i++){
			a[i]+=x;	
		}
		sort_block(u);
		return;
	}
	for(int i=l;i<=t[u];i++) a[i]+=x;
	for(int i=s[v];i<=r;i++) a[i]+=x;
	for(int i=u+1;i<=v-1;i++) delta[i]+=x;
	sort_block(u),sort_block(v);
}
int find(int l,int r,int x){
	return r-(lower_bound(b+l,b+r+1,x)-b)+1;
}
int query(int l,int r,int x){
	int u=belong[l],v=belong[r],sum=0;
	if(u==v){
		return find(l,r,x-delta[u]);
	}
	sum+=find(l,t[u],x-delta[u]);
	for(int i=u+1;i<=v-1;i++) sum+=find(s[i],t[i],x-delta[i]);
	sum+=find(s[v],r,x-delta[v]);
	return sum;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	int len=sqrt((double)n);
	int k=(n-1)/len+1;
	for(int i=1;i<=k;i++){
		s[i]=(i-1)*len+1;
		t[i]=i*len;
	}
	t[k]=n;
	for(int i=1;i<=n;i++){
		belong[i]=(i-1)/len+1;
	}
	for(int i=1;i<=k;i++) sort_block(i);
	for(int i=1;i<=q;i++){
		char op;int l,r,x;
		cin>>op>>l>>r>>x;
		if(op=='M') update(l,r,x);
		else cout<<query(l,r,x)<<"\n";
	}
	return 0;
}

:::

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