站外题求调
  • 板块学术版
  • 楼主hc_awa
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/7/8 14:59
  • 上次更新2023/11/4 18:24:49
查看原帖
站外题求调
366470
hc_awa楼主2021/7/8 14:59

题目链接

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=5e4+7;

int a[N];
int L[N],R[N],pos[N],tag[N],s[N],tmp[N];

int n,siz,tot;

inline void build() {
	siz=sqrt(n);
	while(++tot) {
		L[tot]=R[tot-1]+1;
		R[tot]=min(n,siz*tot);
		sort(tmp+L[tot],tmp+1+R[tot]);
		for(int i=L[tot];i<=R[tot];++i)
			pos[i]=tot,s[tot]+=a[i];
		if(R[tot]==n)
			break;
	}
}

inline void Plus(int x,int y,int delta) {
	int l=pos[x],r=pos[y];
	if(l==r)
		for(int i=x;i<=y;++i)
			a[i]+=delta,s[l]+=delta;
	else {
		for(int i=x;i<=R[l];++i)
			a[i]+=delta,s[l]+=delta;
		for(int i=l+1;i<r;++i)
			tag[i]+=delta,s[i]+=delta*(R[i]-L[i]+1);
		for(int i=L[r];i<=y;++i)
			a[i]+=delta,s[r]+=delta;
	}
}

inline int Find(int x,int y,int delta) {
	int l=pos[x],r=pos[y],ans=0;
	if(l==r) {
		for(int i=x;i<=y;++i)
			if(a[i]+tag[l]<delta)
				++ans;
	}
	else {
		for(int i=x;i<=R[l];++i)
			if(a[i]+tag[l]<delta)
				++ans;
		for(int i=l+1;i<r;++i)
			ans+=lower_bound(tmp+L[i],tmp+1+R[i],delta-tag[i])-tmp-L[i];
		for(int i=L[r];i<=y;++i)
			if(a[i]+tag[r]<delta)
				++ans;
	}
	return ans;
}

signed main() {
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",a+i),tmp[i]=a[i];
	build();
	for(int i=1,op,l,r,c;i<=n;++i) {
		scanf("%d%d%d%d",&op,&l,&r,&c);
		if(op)
			printf("%d\n",Find(l,r,c*c));
		else
			Plus(l,r,c);
	}
    return 0;
}

2021/7/8 14:59
加载中...