站外题求调
  • 板块灌水区
  • 楼主_Dolphin_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/6 12:39
  • 上次更新2023/11/2 15:17:30
查看原帖
站外题求调
638206
_Dolphin_楼主2023/10/6 12:39

link

#include<bits/stdc++.h>
#define afor(x,y,z) for(int x=y;x<=z;x++)
#define bfor(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
typedef const int cint;
cint N=50010,M=230;
int n,a[N],b[N],bel[N],tag[M],L[M],R[M];
void update(int l,int r,int c) {
	if(bel[l]==bel[r]) {
		afor(i,l,r) a[i]+=c;
		afor(i,L[bel[l]],R[bel[l]]) b[i]=a[i];
		sort(b+L[bel[l]],b+R[bel[l]]+1);
	}
	else {
		afor(i,l,R[bel[l]]) a[i]+=c;
		afor(i,L[bel[l]],R[bel[l]]) b[i]=a[i];
		sort(b+L[bel[l]],b+R[bel[l]]+1);
		afor(i,bel[l]+1,bel[r]-1) tag[i]+=c;
		afor(i,L[bel[r]],r) a[i]+=c;
		afor(i,L[bel[r]],R[bel[r]]) b[i]=a[i];
		sort(b+L[bel[r]],b+R[bel[r]]+1);
	}
}
int query(int l,int r,int c) {
	int ans=0;
	if(bel[l]==bel[r]) {afor(i,l,r) if(a[i]<c*c-bel[l]) ans++;}
	else {
		afor(i,l,R[bel[l]]) if(a[i]<c*c-tag[bel[l]]) ans++;
		afor(i,bel[l]+1,bel[r]-1)
			ans+=lower_bound(b+L[i],b+R[i]+1,c*c-tag[i])-b-L[i];
		afor(i,L[bel[r]],r) if(a[i]<c*c-tag[bel[r]]) ans++;
	}
	return ans;
}
int main() {
	scanf("%d",&n);
	int m=sqrt(n),s=sqrt(n),opt,l,r,c;
	afor(i,1,n) {
		scanf("%d",&a[i]);
		bel[i]=(i-1)/m+1;
	}
	afor(i,1,s) L[i]=R[i-1]+1,R[i]=i*m;
	if(m*m<n) s++,L[s]=R[m]+1,R[s]=n;
	memcpy(b,a,sizeof a);
	afor(i,1,s) sort(b+L[i],b+R[i]+1);
	afor(i,1,n) {
		scanf("%d%d%d%d",&opt,&l,&r,&c);
		if(!opt) update(l,r,c);
		else printf("%d\n",query(l,r,c));
	}
	return 0;
}
2023/10/6 12:39
加载中...