zoukankan      html  css  js  c++  java
  • POJ 3170 线段树优化DP

    题意:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    思路:
    先搞一个vector 存以T2结尾的结构体 (结构体里面有开始工作的时间和花费)
    f[i]表示取区间[M,i)的代价
    易得f[i]=min(f[k]+w,f[i]);T1<=k

    //By SiriusRen
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define int long long
    int n,s,e,f[88888],tree[666666];
    struct Node{int x,y,w;}jy;
    vector<Node>v[88888];
    void insert(int l,int r,int pos,int xx){
        if(l==r){tree[pos]=f[l];return;}
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        if(xx<=mid)insert(l,mid,lson,xx);
        else insert(mid+1,r,rson,xx);
        tree[pos]=min(tree[lson],tree[rson]);
    }
    int query(int l,int r,int pos,int L,int R){
        if(l>=L&&r<=R)return tree[pos];
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        if(mid<L)return query(mid+1,r,rson,L,R);
        else if(mid>=R)return query(l,mid,lson,L,R);
        else return min(query(l,mid,lson,L,R),query(mid+1,r,rson,L,R));
    }
    signed main(){
        scanf("%lld%lld%lld",&n,&s,&e),e++;
        for(int i=1;i<=n;i++){
            scanf("%lld%lld%lld",&jy.x,&jy.y,&jy.w);jy.y++;
            v[jy.y].push_back(jy);
        }
        memset(tree,0x3f,sizeof(tree)),memset(f,0x3f,sizeof(f));
        f[s]=0,insert(0,e,1,s);
        for(int i=1;i<=e;i++){
            for(int j=0;j<v[i].size();j++)
                f[i]=min(f[i],query(0,e,1,v[i][j].x,i-1)+v[i][j].w);
            insert(0,e,1,i);
        }
        if(f[e]<f[e+1])printf("%lld
    ",f[e]);
        else puts("-1");
    }

    这里写图片描述

  • 相关阅读:
    c语言中strncpy函数
    c语言中字符串的复制
    c语言 11-6
    c语言 11-5
    c语言 11-4
    c语言中求字符串的长度
    c语言 11-3
    c语言中字符串的复制
    NOIP2006 金明的预算方案
    背包模型
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532198.html
Copyright © 2011-2022 走看看