首先,蒟蒻只是一个考场T1 40pts 走人的菜鸟。这是我关于本题线段树的问题:
if(l>r)return ; 蒟蒻以前貌似没写过这一句#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=5e5+10;
int dp[MAXN],n,a[MAXN];
int lazy[MAXN<<2],l,r,t;
struct Tree{
int l,r,v;
}tr[MAXN<<2];
void pushup(int x){
tr[x].v=max(tr[x<<1].v,tr[x<<1|1].v);
}
void pushdown(int x){
lazy[x<<1]+=lazy[x];
lazy[x<<1|1]+=lazy[x];
tr[x<<1].v+=lazy[x];
tr[x<<1|1].v+=lazy[x];
lazy[x]=0;
}
void build(int x,int l,int r){
if(l>r)return ;
tr[x]=(Tree){l,r,0};lazy[x]=0;
if(l==r)return ;
int m=l+r>>1;
build(x<<1,l,m);
build(x<<1|1,m+1,r);
}
void upd(int x,int l,int r,int k){
if(l>r)return ;
if(l<=tr[x].l&&tr[x].r<=r){
lazy[x]+=k;
tr[x].v+=k;
return ;
}
pushdown(x);
int m=tr[x].l+tr[x].r>>1;
if(l<=m)upd(x<<1,l,r,k);
if(m<r)upd(x<<1|1,l,r,k);
pushup(x);
}
int query(int x,int l,int r){
if(l>r)return 0;
if(l<=tr[x].l&&tr[x].r<=r)
return tr[x].v;
int s=-INT_MAX;
pushdown(x);
int m=tr[x].l+tr[x].r>>1;
if(l<=m)s=max(s,query(x<<1,l,r));
if(m<r)s=max(s,query(x<<1|1,l,r));
return s;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>t;
while(t--){
cin>>n;
build(1,1,n);
for(int i=1;i<=n;++i)cin>>a[i];
for(int i=n;i>=1;--i){
dp[i]=a[i];
l=i+1;r=min<long long>(a[i]+i,n);
dp[i]=max(dp[i],query(1,l,r));
upd(1,i,i,dp[i]);upd(1,l,n,a[i]);
}
cout<<dp[1]<<"\n";
}
return 0;
}
这是蒟蒻的AC代码: