• 1291 火车线路


     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 大师 Master
     
     
    题目描述 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‘

    ’mmzz题目有毒。。。

    本来就是个裸地线段树记录最小值。

    结果误解他题目了,。

    调了三个小时

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cmath>
      5 #include<queue>
      6 #include<algorithm>
      7 #define ls k<<1
      8 #define rs k<<1|1
      9 using namespace std;
     10 const int MAXN=2000001;
     11 void read(int &n)
     12 {
     13     char c='+';int x=0;bool flag=0;
     14     while(c<'0'||c>'9')
     15     {c=getchar();if(c=='-')flag=1;}
     16     while(c>='0'&&c<='9')
     17     {x=x*10+c-48,c=getchar();}
     18     flag==1?n=-x:n=x;
     19 }
     20 int n,m,chair;
     21 int ans=-1;
     22 struct node
     23 {
     24     int l,r,w,fm;
     25 }tree[MAXN*4];
     26 void update(int k)
     27 {
     28     tree[k].w=min(tree[ls].w,tree[rs].w);
     29     
     30 }
     31 void pushdown(int k)
     32 {
     33     tree[ls].w-=tree[k].fm;
     34     tree[rs].w-=tree[k].fm;
     35     tree[ls].fm+=tree[k].fm;
     36     tree[rs].fm+=tree[k].fm;
     37     tree[k].fm=0;
     38     //cout<<"ls:"<<(ls)<<" "<<tree[ls].w<<" ";
     39     //cout<<"rs:"<<(rs)<<" "<<tree[rs].w<<" "<<endl;
     40 }
     41 void build_tree(int ll,int rr,int k)
     42 {
     43     tree[k].l=ll;tree[k].r=rr;
     44     if(ll==rr)
     45     {
     46         tree[k].w=chair;
     47         return ;
     48     }
     49     int mid=(ll+rr)>>1;
     50     build_tree(ll,mid,ls);
     51     build_tree(mid+1,rr,rs);
     52     update(k);
     53 }
     54 void interval_ask(int ll,int rr,int num,int k)
     55 {
     56     if(ll>tree[k].r||rr<tree[k].l)
     57         return ;
     58     if(ll<=tree[k].l&&tree[k].r<=rr)
     59     {
     60         if(tree[k].w<num)
     61             ans=-1;
     62         return ;
     63     }
     64     int mid=(tree[k].l+tree[k].r)>>1;
     65     if(tree[k].fm)
     66     pushdown(k);
     67     if(ll<=mid)
     68     interval_ask(ll,rr,num,ls);
     69     if(rr>mid)
     70     interval_ask(ll,rr,num,rs);
     71     if(tree[k].fm)
     72     pushdown(k);
     73 }
     74 void point_change(int pos,int v,int k)
     75 {
     76     if(pos>tree[k].r||pos<tree[k].l)
     77         return ;
     78     if(tree[k].l==tree[k].r)
     79     {
     80         tree[k].w=v;
     81         return ;
     82     }
     83     point_change(pos,v,ls);
     84     point_change(pos,v,rs);
     85     update(k);
     86 }
     87 
     88 void interval_change(int ll,int rr,int num,int k)
     89 {
     90     if(ll>tree[k].r||rr<tree[k].l)
     91         return ;
     92     if(ll<=tree[k].l&&rr>=tree[k].r)
     93     {
     94         tree[k].w-=num;
     95         tree[k].fm+=num;
     96         return ;
     97     }
     98     int mid=(tree[k].l+tree[k].r)>>1;
     99     if(tree[k].fm)
    100     pushdown(k);
    101     if(ll<=mid)
    102     interval_change(ll,rr,num,ls);
    103     if(rr>mid)
    104     interval_change(ll,rr,num,rs);
    105     update(k);
    106 }
    107 int main()
    108 {
    109     read(n);read(chair);read(m);
    110     build_tree(1,n,1);
    111     for(int i=1;i<=m;i++)
    112     {
    113         int l,r,num;
    114         ans=1;
    115         read(l);read(r);read(num);
    116         r--;
    117         interval_ask(l,r,num,1);
    118         if(ans!=1)
    119             printf("N
    ");
    120         else 
    121         {
    122             interval_change(l,r,num,1);
    123             printf("T
    ");    
    124         }
    125     }
    126     return 0;
    127 } 
  • 相关阅读:
    学习进度表
    201671010144 2016-2017《java程序设计》图形程序设计
    201671010144 2016-2017《java程序设计》我所理解的继承!
    201671010144 2016-2017《java程序设计》 反思。
    201671010144 2016-2017《java程序设计》 前四章总结!
    201671010144 2016-2017 《java程序设计》--对象与类!
    201671010144 2016-2017-2-------《java程序设计》 学习java!
    201671010144 2016-2017-2 《java程序设计》--学习中遇到的问题!
    201671010144 2016-2017-2 《java程序设计》--认识java!
    软件工程实践2017第一次作业-准备
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7138014.html
Copyright © 2020-2023  润新知