POJ-3171-Cleaning Shifts

用线段树维护就好,每次更新取最优

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=1<<29;
const int maxn=1e4+100;
const int maxm=1e5;
struct Node
{
    int t1;
    int t2;
    int c;
    Node(){}
    Node(int st1,int st2,int sc):t1(st1),t2(st2),c(sc){}
    bool operator < (const Node &a)const
    {
        if(t1==a.t1)
            return t2<a.t2;
        return t1<a.t1;
    }
}a[maxn];
struct Tree
{
    int l;
    int r;
    int val;
    int update;
}t[maxm*4];
int n,m,e,cnt;
void Build(int l,int r,int index)
{
    t[index].l=l;
    t[index].r=r;
    t[index].val=inf;
    t[index].update=inf;
    if(l==r)
        return;
    int mid=(t[index].l+t[index].r)>>1;
    Build(l,mid,index<<1);
    Build(mid+1,r,index<<1|1);
}
void PushDown(int index)
{
    if(t[index].l==t[index].r)
        return;
    if(t[index].update!=inf)
    {
        t[index<<1].val=min(t[index<<1].val,t[index].update);
        t[index<<1|1].val=min(t[index<<1|1].val,t[index].update);
        t[index<<1].update=min(t[index<<1].update,t[index].update);
        t[index<<1|1].update=min(t[index<<1|1].update,t[index].update);
        t[index].update=inf;
    }
}
void PushUp(int index)
{
    t[index].val=min(t[index<<1].val,t[index<<1|1].val);
}
int Query(int l,int r,int index)
{
    PushDown(index);
    if(t[index].l==l&&t[index].r==r)
        return t[index].val;
    int mid=(t[index].l+t[index].r)>>1;
    int ans;
    if(r<=mid)
        return Query(l,r,index<<1);
    else if(l>mid)
        return Query(l,r,index<<1|1);
    return min(Query(l,mid,index<<1),Query(mid+1,r,index<<1|1));
}
void Update(int l,int r,int index,int val)
{
    PushDown(index);
    if(t[index].l==l&&t[index].r==r)
    {
        t[index].val=min(t[index].val,val);
        t[index].update=min(t[index].update,val);
        return;
    }
    int mid=(t[index].l+t[index].r)>>1;
    if(r<=mid)
        Update(l,r,index<<1,val);
    else if(l>mid)
        Update(l,r,index<<1|1,val);
    else
    {
        Update(l,mid,index<<1,val);
        Update(mid+1,r,index<<1|1,val);
    }
    PushUp(index);
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&e)!=EOF)
    {
        cnt=0;
        e-=m;
        Build(0,e,1);
        for(int i=0;i<n;i++)
        {
            int t1,t2,c;
            scanf("%d%d%d",&t1,&t2,&c);
            if(t2<m)
                continue;
            t1-=m;
            t1=max(t1,0);
            t2-=m;
            t2=max(t2,0);
            t2=min(t2,e);
            a[cnt++]=Node(t1,t2,c);
        }
        sort(a,a+cnt);
        bool is=true;
        for(int i=0;i<cnt;i++)
        {
            if(a[i].t1==0)
                Update(a[i].t1,a[i].t2,1,a[i].c);
            else
            {
                int val=Query(a[i].t1-1,a[i].t2-1,1);
                if(val==inf)
                {
                    is=false;
                    break;
                }
                Update(a[i].t1,a[i].t2,1,val+a[i].c);
            }
        }
        if(!is)
            printf("-1\n");
        else
            printf("%d\n",Query(e,e,1));

    }
    return 0;
}


你可能感兴趣的:(线段树)