分块二,0pts求条
  • 板块学术版
  • 楼主20090818Cc
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/6/18 10:27
  • 上次更新2025/6/18 15:07:10
查看原帖
分块二,0pts求条
1268457
20090818Cc楼主2025/6/18 10:27

题面

代码如下:样例能过qmq

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=2e5+110;
inline int read(){
	int sum=0,k=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')k=-1;c=getchar();
	}while(c>='0'&&c<='9'){sum=sum*10+c-48;c=getchar();
	}return sum*k;
}
struct _fenkuai{
	int lz,rz,lazy;
}fk[M];
int n,a[M],pos[M],bl;
inline void opt_0(int l,int r,int c){
	int ql=pos[l],qr=pos[r];
	if(ql==qr){
		for(int i=l;i<=r;i++) a[i]+=c;
		sort(a+fk[ql].lz,a+1+fk[qr].rz);
		return ;
	}
	for(int i=l;i<=fk[ql].rz;i++) a[i]+=c;
	sort(a+fk[ql].lz,a+1+fk[ql].rz);
	for(int i=fk[qr].lz;i<=r;i++) a[i]+=c;
	sort(a+fk[qr].lz,a+1+fk[qr].rz);
	for(int i=ql+1;i<qr;i++) fk[i].lazy+=c;
}
inline int fin(int l,int r,int c){
    if(a[l]>=c) return 0;
    if(a[r]<c) return r-l+1;
    int ll=l,rr=r,mid;
    while(ll<rr) {
        mid=(ll+rr)>>1;
        if(a[mid]<c) ll=mid+1;
        else rr=mid-1;
    }
    return ll-l+1;
}
inline void opt_1(int l,int r,int c){
	c=c*c;
	int ql=pos[l],qr=pos[r],cnt=0;
	if(ql==qr){
		printf("%lld\n",fin(l,r,c-fk[ql].lazy));
		return ;
	}
	cnt+=fin(l,fk[ql].rz,c-fk[ql].lazy);
	cnt+=fin(fk[qr].lz,r,c-fk[qr].lazy);
	for(int i=ql+1;i<qr;i++)
		cnt+=fin(fk[i].lz,fk[i].rz,c-fk[i].lazy);
	printf("%lld\n",cnt);
	return ;
}
signed main(){
	n=read(),bl=sqrt(n);
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=bl;i++)	fk[i].lz=bl*(i-1)+1,fk[i].rz=bl*i;
	if(fk[bl].rz<n) fk[++bl].rz=n,fk[bl].lz=fk[bl-1].rz+1;
	for(int i=1;i<=bl;i++){
		for(int j=fk[i].lz;j<=fk[i].rz;j++) pos[j]=i;
		sort(a+fk[i].lz,a+fk[i].rz+1);
	}
	for(int i=1;i<=n;i++){
		int opt=read(),l=read(),r=read(),c=read();
		if(opt==0) opt_0(l,r,c);
		if(opt==1) opt_1(l,r,c);
	}
	return 0;
}
/*
10 
10 9 8 7 6 5 4 3 2 1
*/
2025/6/18 10:27
加载中...