zoukankan      html  css  js  c++  java
  • NC218445 九峰与分割序列(线段树+dp)

    套路题,首先发现dp可做

    但是直接枚举复杂度太高,并且发现我们求的都是区间最值,因此考虑线段树优化

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=1e5+10;
    const ll inf=0x3f3f3f3f3f3f3f3f;
    const int mod=1e9+7;
    int n,k;
    int a[N];
    ll sum[N];
    ll f[N][2];
    struct seg{
        int l,r;
        ll mx;
    };
    struct node{
        seg tr[N<<2];
        void build(int u,int l,int r){
            if(l==r){
                tr[u]={l,r,-inf};
            }
            else{
                tr[u]={l,r,-inf};
                int mid=l+r>>1;
                build(u<<1,l,mid);
                build(u<<1|1,mid+1,r);
            }
        }
        void pushup(int u){
            tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
        }
        void modify(int u,int l,ll x){
            if(tr[u].l==tr[u].r){
                tr[u].mx=x;
                return ;
            }
            int mid=tr[u].l+tr[u].r>>1;
            if(l<=mid)
                modify(u<<1,l,x);
            else{
                modify(u<<1|1,l,x);
            }
            pushup(u);
        }
        ll query(int u,int l,int r){
            if(l>r)
                return 0;
            if(tr[u].l>=l&&tr[u].r<=r){
                return tr[u].mx;
            }
            int mid=tr[u].l+tr[u].r>>1;
            ll ans=-inf;
            if(l<=mid)
                ans=max(ans,query(u<<1,l,r));
            if(r>mid)
                ans=max(ans,query(u<<1|1,l,r));
            return ans;
        }
    }T[5];
    int main(){
        ios::sync_with_stdio(false);
        cin>>n>>k;
        int i;
        for(i=1;i<=3;i++)
            T[i].build(1,0,n);
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=1;i<=n;i++){
            sum[i]=sum[i-1]+a[i];
        }
        for(i=1;i<=n;i++){
            f[i][0]=f[i][1]=-inf;
            if(i<=k)
                f[i][1]=sum[i];
            else{
                f[i][0]=max(T[1].query(1,1,i-k-1),T[2].query(1,1,i-k-1))+sum[i];
                f[i][1]=T[3].query(1,i-k,i)+sum[i]*2;
                f[i][1]=max(f[i][1],T[2].query(1,i-k,i)+sum[i]);
            }
            T[1].modify(1,i,f[i][0]-sum[i]);
            T[2].modify(1,i,f[i][1]-sum[i]);
            T[3].modify(1,i,f[i][0]-sum[i]*2);
        }
        cout<<max(f[n][0],f[n][1])<<endl;
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    雑談
    safari下无法模拟click()的解决方法 ------转载
    用户操作
    居中
    replace 重写
    JS数组添加元素的三种方式
    Asp.Net Core 包
    CSS3 动画 可以参考
    CSS3 动画
    完全居中
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14449735.html
Copyright © 2011-2022 走看看