萌新问一下为啥80

P1725 琪露诺

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倍试试


|