zoukankan      html  css  js  c++  java
  • codevs 1291 火车线路

    题目描述 Description

    某列火车行使在C个城市之间(出发的城市编号为1,结束达到的城市的编号为C),假设该列火车有S个座位,现在有R笔预订票的业务。现在想对这R笔业务进行处理,看哪些预定能满足,哪些不能满足。

    一笔预定由O、D、N三个整数组成,表示从起点站O到目标站D需要预定N个座位。一笔预定能满足是指该笔业务在行程范围内有能满足的空座位,否则就不能满足。一笔业务不能拆分,也就是起点和终点站不能更改,预定的座位数目也不能更改。所有的预定需求按给出先后顺序进行处理。

    请你编写程序,看那些预定业务能满足,那些不能满足。

    输入描述 Input Description

           输入文件中的第一行为三个整数CSR(1<=c<=60 000, 1<=s<=60 000, 1<=r<=60 000)他们之间用空隔分开。接下来的R行每行为三个整数O、D、N,(1<=o<d<=c, 1<=n<=s),分别表示每一笔预定业务。

    输出描述 Output Description

           对第I笔业务,如果能满足,则在输出文件的第I行输出“T”,否则输出“N”

    样例输入 Sample Input
    4 6 4
    1 4 2
    1 3 2
    2 4 3

    1 2 3

    样例输出 Sample Output
    T
    T
    N

     N

    这是一道有坑的水题

    线段树维护区间最小值,

    这里不能一边查一边减,有可能前面符合要求,减了,后面却不符合要求

    所以要如果判断满足,减,否则不减

    坑:::订单从l到r,实际操作的区间应该是[l,r-1],因为目标站就下车了,不占用座位

    #include<cstdio>
    #include<algorithm>
    #define N 60001
    using namespace std;
    int n,m,opl,opr,w,q;
    bool ok;
    class tree
    {
        private:
            struct node
            {
                int l,r,minn,f;
            }tr[N*4];
        public:
        void build(int k,int l,int r)
        {
            tr[k].l=l;tr[k].r=r;
            if(l==r)
            {
                tr[k].minn=m;
                return;
            }
            int mid=l+r>>1;
            build(k<<1,l,mid);
            build(k<<1|1,mid+1,r);
            tr[k].minn=min(tr[k<<1].minn,tr[k<<1|1].minn);
        }
        void down(int k)
        {
            tr[k<<1].minn-=tr[k].f;
            tr[k<<1|1].minn-=tr[k].f;
            tr[k<<1].f+=tr[k].f;
            tr[k<<1|1].f+=tr[k].f;
            tr[k].f=0;
        }
        void solve(int k,int g)
        {
            if(tr[k].l>=opl&&tr[k].r<=opr)
            {
                if(g==1)  { if(tr[k].minn<w) ok=true; }
                else 
                {
                    tr[k].minn-=w;
                    tr[k].f+=w;
                }
                return;
            }
            if(tr[k].f) down(k);
            int mid=tr[k].l+tr[k].r>>1;
            if(opl<=mid) solve(k<<1,g);
            if(opr>mid) solve(k<<1|1,g);
            if(g==2) tr[k].minn=min(tr[k<<1].minn,tr[k<<1|1].minn);
         }
    }t;
    int main()
    {
        scanf("%d%d%d",&n,&m,&q);
        t.build(1,1,n);
        for(int i=1;i<=q;i++)
        {
            ok=false;
            scanf("%d%d%d",&opl,&opr,&w);
            opr--;
            t.solve(1,1);
            if(ok) puts("N");
            else
            {
                puts("T");
                t.solve(1,2);
            }
        }
        return 0;
    }
  • 相关阅读:
    【存货管理】存货的计价方法
    【NHibernate】列“ReservedWord”不属于表 ReservedWords
    【MySQL】MySQL中where条件的执行分析
    brew卸载&重新安装
    mac nvm安装&使用&一些问题解决方案
    python初始环境配置
    股票数据api整理
    输入一个url到页面渲染完毕过程
    自己简单封装一个promise
    节流&防抖
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6825979.html
Copyright © 2011-2022 走看看