社区讨论
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 条回复,欢迎继续交流。
正在加载回复...