loj.ac 数列分块入门 2
  • 板块题目总版
  • 楼主BVVD_FM
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/6/24 22:11
  • 上次更新2023/11/3 12:28:38
查看原帖
loj.ac 数列分块入门 2
808332
BVVD_FM楼主2023/6/24 22:11
#include<iostream>//区间修改+区间查询 比某个数小的数的个数 
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5e5+10,K=250;
#define int long long
int n;
int len;
int a[N];
int loc[K];//判断数属于那个块 
int cop[N];//操作sort时存下数 
struct node{
	int l,r;
	int lazy;//lazy存块整体处理的数
}bkl[K];
int tot;
void reset(int x){//sort块 	
	for(int i=bkl[x].l;i<=bkl[x].r;i++){
		cop[i]=a[i]+bkl[x].lazy;
		a[i]+=bkl[x].lazy;
	}
	bkl[x].lazy=0;
	sort(cop+bkl[x].l+1,cop+bkl[x].r+1);
}
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void CZ(int l,int r,int val){
	int st=loc[l],en=loc[r];//那些块
	if(st==en){//在一个块内 
		for(int i=l;i<=r;i++)a[i]+=val;
		reset(st);
	}else{//不在一个块 
		for(int i=l;i<=bkl[st].r;i++)a[i]+=val;//左边 
		reset(st);
		for(int i=bkl[en].l;i<=r;i++)a[i]+=val;//右边 
		reset(en);
		for(int i=st+1;i<en;i++)bkl[i].lazy+=val;//中间的块
	}
}
int query(int l,int r,int c){
	int ans=0;
	int st=loc[l],en=loc[r];
	if(st==en){
		for(int i=l;i<=r;i++)if(a[i]+bkl[st].lazy<c) ans++;
	}else{
		for(int i=l;i<=bkl[st].r;i++)if(a[i]+bkl[st].lazy<c) ans++;
		for(int i=bkl[en].l;i<=r;i++)if(a[i]+bkl[en].lazy<c) ans++;
		for(int i=st+1;i<en;i++) ans+=lower_bound(cop+bkl[i].l,cop+bkl[i].r+1,c-bkl[i].lazy)-(cop+bkl[i].l); 
	}
	return ans;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		a[i]=read();
	}
	int len=sqrt(n);
	tot=n/len;
	if(n%len) tot++;
	for(int i=1;i<=n;++i){
		loc[i]=(i-1)/len+1;
	}
	for(int i=1;i<=tot;++i){
		bkl[i].l=(i-1)*len+1;
		bkl[i].r=(i)*len;
	}
	bkl[tot].r=n;
	for(int i=1;i<=tot;++i){
		reset(i);
	}
	while(n--){
		int x,y,val,op;
		op=read(),x=read(),y=read(),val=read();
		if(op==0){
			CZ(x,y,val);
		}else{
		printf("%lld\n",query(x,y,val*val)); 
		}
	}
	return 0;
}

分块哪里出问题了,求大佬orz

2023/6/24 22:11
加载中...