Aoki_灏 @ 2018-07-28 15:36:17
这里用的线段树优化
#include <bits/stdc++.h>
#define N 200001
#define lson 2*p
#define rson 2*p+1
using namespace std;
int n,m,l,r,x,dp[N],ans,data[N];
struct node
{
int maxx,lt,rt;
}a[N*4];
void pushup(int p)
{
a[p].maxx=max(a[lson].maxx,a[rson].maxx);
}
void build(int p,int l,int r)
{
a[p].rt=r;a[p].lt=l;
if(l==r){a[p].maxx=0;return ;}
int mid=(l+r)/2;
build(lson,l,mid);
build(rson, mid+1,r);
pushup(p);
}
int query(int p,int l,int r)
{
if(a[p].lt==l&&a[p].rt==r)return a[p].maxx;
int mid=(a[p].lt+a[p].rt)/2;
if(r<=mid)return query(lson ,l,r);
else if(l>mid)return query(rson,l,r);
else return max(query(lson,l,mid),query(rson,mid+1,r));
}
void add(int p,int l,int r,int d)
{
if(a[p].rt==r&&a[p].lt==l){a[p].maxx=d;return ;}
int mid=(a[p].lt+a[p].rt)/2;
if(r<=mid)add(lson,l,r,d);
else if(l>mid)add(rson,l,r,d);
else add(lson,l,mid,d),add(rson,mid+1,r,d);
pushup(p);
}
int main()
{
scanf("%d%d%d",&n,&l,&r);
for(int i=0;i<=n;i++)scanf("%d",&data[i]);
build(1,0,n+r);
for(int i=l;i<=n+r;i++)
{
int x=query(1,max(0,i-r),i-l);
dp[i]=x+data[i];
add(1,i,i,dp[i]);
}
for(int i=n+1;i<=n+r;i++)
ans=max(ans,dp[i]);
printf("%d",ans);
return 0;
}
这样把[n-r+1,n]转移到[n+1,n+r]中有什么问题吗??
我对拍了很久都出不来问题
by kl膜法59改 @ 2018-07-28 15:37:25
搞不懂...巨神的错误萌新看不出来
by JYTS @ 2018-07-28 15:37:40
搞不懂...巨神的错误萌新看不出来
by Aoki_灏 @ 2018-07-28 15:38:40
@大帅哥就是ME emmm毒瘤
by FCBM71 @ 2018-07-28 15:58:49
搞不懂...巨神的错误萌新看不出来
by arfa @ 2018-07-28 16:14:53
既然不知打的是线段树还是主席树qwq...
by Aoki_灏 @ 2018-07-28 16:19:10
@arfa 最。。最普通的线段树啦,主席树不怎么会用,问题是dp里面的和线段树没啥关系
by ysj1173886760 @ 2018-08-01 16:17:59
可能是空间,开10倍试试