社区讨论

AC on #8,9,20,21,其余WA

P13978数列分块入门 3参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@miduq77m
此快照首次捕获于
2025/11/25 08:42
3 个月前
此快照最后确认于
2025/11/25 10:50
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
const int SQ=505;
int n,a[N],b[N],nn,tot,bel[N];
int st[SQ],ed[SQ],sum[SQ],tag[SQ];
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 init()
{
	nn=sqrt(n);
	for(int i=1;i<=n;i+=nn) st[++tot]=i,ed[tot]=i+nn-1;ed[tot]=n;
	for(int i=1;i<=tot;sort(a+st[i],a+ed[i]+1),++i)
		for(int j=st[i];j<=ed[i];++j) bel[j]=i;
}
void upd(int l,int r,int c)
{
	int x=bel[l],y=bel[r];
	for(int i=l;i<=r;++i) b[i]+=c;
	for(int i=st[x];i<=ed[x];++i) a[i]=b[i];
	sort(a+st[x],a+ed[x]+1);
}
void update(int l,int r,int c)
{
	int x=bel[l],y=bel[r];
	if(x==y) {upd(l,r,c);return;}
	if(l!=st[x]) {upd(l,ed[x],c);x++;}
	if(r!=ed[y]) {upd(st[y],r,c);y--;}
	for(int i=x;i<=y;++i) tag[i]+=c;
}
int Bcalc(int l,int r,int k) {return *(lower_bound(a+l,a+r+1,k-tag[bel[l]])-1);}
int Scalc(int l,int r,int k)
{
	int ret=-1e18;
	for(int i=l;i<=r;++i)
		if(b[i]+tag[bel[i]]<k) ret=max(ret,b[i]+tag[bel[i]]);
	return ret==-1e18?-1:ret;
}
int query(int l,int r,int c)
{
	int x=bel[l],y=bel[r],ret;
	if(x==y) return Scalc(l,r,c);
	ret=max(Scalc(l,ed[x],c),Scalc(st[y],r,c));x++,y--;
	for(int i=x;i<=y;++i) ret=max(ret,Bcalc(st[i],ed[i],c)+tag[i]);
	return ret<c&&ret!=-1e18?ret:-1;
}
signed main()
{
	n=read();
	for(int i=1;i<=n;++i) a[i]=b[i]=read();
	init();
	for(int i=1;i<=n;++i)
	{
		int op=read(),l=read(),r=read(),c=read();
		if(op==0) update(l,r,c);
		if(op==1) printf("%lld\n",query(l,r,c));
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...