• 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;
    }
  • 相关阅读:
    mysql:基础管理、体系结构、升级降级
    Linux网络基础
    mysql 忘记本地密码
    seq命令的用法
    mysql03-SQL应用
    SolidWorks 如何改变封闭草图的背景颜色
    新版 AD 无法选中某些部件(如 Via,Pad)的问题
    安装 dot net 时出现严重错误 0x80070643 安装时发生严重错误 1603 ndp48
    IO 口扩展
    自动波特率检测
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6825979.html
Copyright © 2020-2023  润新知