蒟蒻の弱智问题,求路过谷民不吝赐教
查看原帖
蒟蒻の弱智问题,求路过谷民不吝赐教
572587
cmrhhh楼主2024/5/3 20:19

首先,蒟蒻只是一个考场T1 40pts 走人的菜鸟。这是我关于本题线段树的问题:

  1. 为什么要加 if(l>r)return ; 蒟蒻以前貌似没写过这一句
  2. 我的upd,query 42,43行,54,55行传参为什么l,r不可以写lm,m+1,r?蒟蒻不懂。
#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代码:

2024/5/3 20:19
加载中...