社区讨论
10pts求调
P4192旅行规划参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhj0tnqp
- 此快照首次捕获于
- 2025/11/03 18:52 4 个月前
- 此快照最后确认于
- 2025/11/03 18:52 4 个月前
n方过十万后想写正解。样例能过,求调
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<long long,long long>
#define fi first
#define se second
const int N=2e5;
const int S=505;
int m,n,a[N],t[S];
int op,l,r,k,top[S];
pii p[S][S];
pii tg[S];
int B;
void upd(int l,int r){
for(int i=l;i<=r;i+=B)top[i/B]=0;
for(int i=l;i<=r;i++){
while((top[i/B]>1&&(p[i/B][top[i/B]-1].se-p[i/B][top[i/B]].se)*(p[i/B][top[i/B]].fi-(i-i/B*B+1))<(p[i/B][top[i/B]-1].fi-p[i/B][top[i/B]].fi)*(p[i/B][top[i/B]].se-a[i]))||(top[i/B]==1&&(p[i/B][top[i/B]-1].se-p[i/B][top[i/B]].se)*(p[i/B][top[i/B]].fi-(i-i/B*B+1))==(p[i/B][top[i/B]-1].fi-p[i/B][top[i/B]].fi)*(p[i/B][top[i/B]].se-a[i])))
top[i/B]--;
p[i/B][++top[i/B]]={i-i/B*B+1,a[i]};
}
}
int gt(int i,int k){
int l=1,r=top[i],mid,ans=0;
while(l<=r){
mid=(r+l)/2;
if(p[i][mid].se-p[i][mid-1].se>k*p[i][mid].fi-p[i][mid-1].fi)l=mid+1,ans=mid;
else r=mid-1;
}
return p[i][ans].se-k*p[i][ans].fi;
}
signed main(){
cin>>n;
B=sqrt(n);
for(int i=0;i<=n/B;i++)p[i][0]={0,-9e18};
for(int i=0;i<n;i++){
cin>>a[i];
if(i)a[i]+=a[i-1];
t[i/B]=max(t[i/B],a[i]);
}upd(0,n-1);
cin>>m;
for(int i=1;i<=m;i++){
cin>>op>>l>>r;
if(op==0){
cin>>k;
if(l/B*B==r/B*B){
int ad=tg[l/B].fi;
for(int i=l/B*B;i<(l/B*B+B);i++,ad+=tg[l/B].se)a[i]+=ad;
tg[l/B]={0,0};
ad=k;
for(int i=l;i<=r;i++,ad+=k)a[i]+=ad;
upd(l/B*B,l/B*B+B-1);
}
else{
int ad=tg[l/B].fi;
for(int i=l/B*B;i<l/B*B+B;i++,ad+=tg[l/B].se)a[i]+=ad;
tg[l/B]={0,0};
ad=tg[r/B].fi;
for(int i=r/B*B;i<r/B*B+B;i++,ad+=tg[r/B].se)a[i]+=ad;
tg[r/B]={0,0};
ad=k;
for(int i=l;i<l/B*B+B;i++,ad+=k)a[i]+=ad;
for(int i=l/B+1;i<r/B;i++,ad+=B*k)tg[i].fi+=ad,tg[i].se+=k,t[i]=gt(i,-tg[i].se)+tg[i].fi;
for(int i=r/B*B;i<=r;i++,ad+=k)a[i]+=ad;
upd(l/B*B,l/B*B+B-1);
upd(r/B*B,r/B*B+B-1);
}
}
else{
int ans=-9e18;
if(l/B*B==r/B*B){
int ad=tg[l/B].fi;
for(int i=l/B*B;i<l/B*B+B;i++,ad+=tg[l/B].se)a[i]+=ad;
tg[l/B]={0,0};
upd(l/B*B,l/B*B+B-1);
for(int i=l;i<=r;i++)ans=max(ans,a[i]);
}
else{
int ad=tg[l/B].fi;
for(int i=l/B*B;i<l/B*B+B;i++,ad+=tg[l/B].se)a[i]+=ad;
tg[l/B]={0,0};
upd(l/B*B,l/B*B+B-1);
ad=tg[r/B].fi;
for(int i=r/B*B;i<r/B*B+B;i++,ad+=tg[r/B].se)a[i]+=ad;
for(int i=l;i<l/B*B+B;i++)ans=max(ans,a[i]);
for(int i=l/B+1;i<r/B;i++)ans=max(ans,t[i]);
for(int i=r/B*B;i<=r;i++)ans=max(ans,a[i]);
}
cout<<ans<<'\n';
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...