大佬,玄关,求条
查看原帖
大佬,玄关,求条
957917
ljkgs6789楼主2024/9/30 16:22

不知道为什么,只有40分

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll T,n,a[100010];
ll dp[100010];
struct node{
	ll maxx,tag;
}t[400010];
void down(ll k,ll l,ll r){
	t[k<<1].tag+=t[k].tag;
	t[k<<1|1].tag+=t[k].tag;
	t[k<<1].maxx+=t[k].tag;
	t[k<<1|1].maxx+=t[k].tag;
	t[k].tag=0;
}
void build(int l,int r,int p) {
	if(l>r)return ;
	t[p].maxx=0;
	if(l==r)return ;
	int mid=l+r>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
}
void modify(ll k,ll l,ll r,ll ql,ll qr,ll x){
	if(l>qr||r<ql||l>r)return ;
	if(l>=ql&&r<=qr){
		t[k].tag+=x;
		t[k].maxx+=x;
		return ;
	}
	down(k,l,r);
	ll mid=l+r>>1;
	modify(k<<1,l,mid,ql,qr,x);
	modify(k<<1|1,mid+1,r,ql,qr,x);
	t[k].maxx=max(t[k<<1].maxx,t[k<<1|1].maxx);
}
ll query(ll k,ll l,ll r,ll ql,ll qr){
	if(l>qr||r<ql||l>r)return 0;
	if(l>=ql&&r<=qr)return t[k].maxx;
	down(k,l,r);
	ll mid=l+r>>1,res=0;
	res=max(res,query(k<<1,l,mid,ql,qr));
	res=max(res,query(k<<1|1,mid+1,r,ql,qr));
	return res;
}
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		build(1,n,1);
		for(ll i=1;i<=n;i++){
			cin>>a[i];
		}
		for(ll i=n;i>=1;i--){
			dp[i]=a[i];
			ll l=i+1,r=min(n,i+a[i]);
			dp[i]=max(dp[i],query(1,1,n,l,r));
			modify(1,1,n,l,n,a[i]),
			modify(1,1,n,i,i,dp[i]);
		}
		cout<<dp[1]<<endl;
	}
	return 0;
}
2024/9/30 16:22
加载中...