数列分块板子RE求助(悬棺)
  • 板块灌水区
  • 楼主xht_G
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/7/24 11:08
  • 上次更新2024/7/24 12:01:44
查看原帖
数列分块板子RE求助(悬棺)
823535
xht_G楼主2024/7/24 11:08

RT,区间加+区间查询小于x的数的个数,数组大小没问题,为何RE?

#include<bits/stdc++.h>
#define PII pair<int,int>
#define DB double
#define LL long long
#define int long long
//#define int __int128
//const int mod=1e9+7;
//const int mod=998244353;
const LL inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
namespace FastIO{
	inline int read(int mod){
		int x=0,f=1;char ch=getchar();
		if(mod==0){while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}}
		else{while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x*10%mod+ch-48)%mod;ch=getchar();}}
		return x*f;}
	inline char cread(){char x;while(x==0||x==' '||x=='\n'||x=='\r')x=getchar();return x;}
	inline void write(int x){if(x<0)putchar('-'),x=-x;if(x==0)return;write(x/10),putchar(x%10+'0');}
}
using namespace FastIO;
using namespace std;
int a[50005];
vector<PII>val[235];
int add[235],pos[235],lf[235],rg[235];
int pts=230,cnt=0;
signed main(){
	int n=read(0);
	for(int i=1;i<=n;++i)
		a[i]=read(0);
	for(int i=1;i+pts-1<=n;i+=pts){
		++cnt,add[cnt]=0,lf[cnt]=i,rg[cnt]=i+pts-1;
		for(int j=lf[cnt];j<=rg[cnt];++j)
			pos[j]=cnt,val[cnt].push_back({a[j],j});
		sort(val[cnt].begin(),val[cnt].end());
	}
	++cnt,add[cnt]=0,lf[cnt]=(n/pts)*pts+1,rg[cnt]=n;
	for(int j=lf[cnt];j<=rg[cnt];++j)
		pos[j]=cnt,val[cnt].push_back({a[j],j});
	sort(val[cnt].begin(),val[cnt].end());
	for(int qry=1;qry<=n;++qry){
		int op=read(0),l=read(0),r=read(0),c=read(0);
		if(op==0){
			for(int i=pos[l]+1;i<=pos[r]-1;++i)add[i]+=c;
			for(PII &pii:val[pos[l]]){
				pii.first+=add[pos[l]];
				if(l<=pii.second&&pii.second<=r)pii.first+=c;
			}
			add[pos[l]]=0,sort(val[pos[l]].begin(),val[pos[l]].end());
			if(pos[l]==pos[r])continue;
			for(PII &pii:val[pos[r]]){
				pii.first+=add[pos[r]];
				if(l<=pii.second&&pii.second<=r)pii.first+=c;
			}
			add[pos[r]]=0,sort(val[pos[r]].begin(),val[pos[r]].end());
		}
		if(op==1){
			int ans=0;
			for(int i=pos[l]+1;i<=pos[r]-1;++i){
				auto it=lower_bound(val[i].begin(),val[i].end(),make_pair(c*c-add[i],-inf));
				ans+=it-val[i].begin();
			}
			for(PII &pii:val[pos[l]]){
				pii.first+=add[pos[l]];
				if(l<=pii.second&&pii.second<=r&&pii.first<=c*c)++ans;
			}
			add[pos[l]]=0,sort(val[pos[l]].begin(),val[pos[l]].end());
			if(pos[l]!=pos[r]){
				for(PII &pii:val[pos[r]]){
					pii.first+=add[pos[r]];
					if(l<=pii.second&&pii.second<=r&&pii.first<=c*c)++ans;
				}
				add[pos[r]]=0,sort(val[pos[r]].begin(),val[pos[r]].end());
			}
			printf("%lld\n",ans);
		}
	}
	return 0;
}
2024/7/24 11:08
加载中...