社区讨论
奇怪,仅ACon#1,8,11,20,悬三关求调
P13978数列分块入门 3参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mjhyuy8m
- 此快照首次捕获于
- 2025/12/23 10:29 2 个月前
- 此快照最后确认于
- 2025/12/25 20:25 2 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0' && c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n=read(),a[N],b[N],pos[N],l[N],r[N],add[N];
inline void update(int L,int R,int c){
int p=pos[L],q=pos[R];
if(p==q){
for(int i=L;i<=R;i++)
a[i]+=c;
for(int i=l[p];i<=r[p];i++)
b[i]=a[i];
sort(b+l[p],b+r[p]+1);
}
else{
for(int i=p+1;i<=q-1;i++)
add[i]+=c;
for(int i=L;i<=r[p];i++)
a[i]+=c;
for(int i=l[p];i<=r[p];i++)
b[i]=a[i];
sort(b+l[p],b+r[p]+1);
for(int i=l[q];i<=R;i++)
a[i]+=c;
for(int i=l[q];i<=r[q];i++)
b[i]=a[i];
sort(b+l[q],b+r[q]+1);
}
}
inline int query(int L,int R,int c){
int p=pos[L],q=pos[R],ans=-LONG_LONG_MAX;
if(p==q){
for(int i=L;i<=R;i++)
if(a[i]+add[p]<c && a[i]+add[p]>ans)
ans=a[i]+add[p];
}
else{
for(int i=L;i<=r[p];i++)
if(a[i]+add[p]<c && a[i]+add[p]>ans)
ans=a[i]+add[p];
for(int i=l[q];i<=R;i++)
if(a[i]+add[q]<c && a[i]+add[q]>ans)
ans=a[i]+add[q];
for(int i=p+1;i<=q-1;i++){
int x=lower_bound(b+l[i],b+r[i]+1,c-add[i])-b-1;
ans=max(ans,b[x]+add[i]);
}
}
return ans;
}
signed main(){
for(int i=1;i<=n;i++)
a[i]=read(),b[i]=a[i];
int t=sqrt(n);
for(int i=1;i<=t;i++){
l[i]=(i-1)*sqrt(n)+1;
r[i]=i*sqrt(n);
sort(b+l[i],b+r[i]+1);
}
if(r[t]<n){
t++;
l[t]=r[t-1]+1;
r[t]=n;
sort(b+l[t],b+r[t]+1);
}
for(int i=1;i<=t;i++)
for(int j=l[i];j<=r[i];j++)
pos[j]=i;
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){
int ans=query(L,R,c);
if(ans==-LONG_LONG_MAX)
puts("-1");
else
printf("%lld\n",ans);
}
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...