• JZOJ 1294. 轻轨


    题目

    Description

      有N(1<=N<=20,000)个站点的轻轨站,有一个容量为C(1<=C<=100)的列车起点在1号站点,终点在N号站点,有K(K<=50,000)组牛群,每组数量为M_i(1<=M_i<=N),行程起点和终点分别为S_i和E_i(1<=S_i<E_i<=N)
      计算最多有多少头牛可以搭乘轻轨。
     

    Input

      第1行:3个空格隔开的整数K,N,C
      第2到K+1行:描述每组奶牛的情况,每行3个空格隔开的整数S_i,E_i和M_i

    Output

      输出一个整数表示最多可以搭乘轻轨的牛的数量。
     

    Sample Input

    8 15 3
    1 5 2
    13 14 1
    5 8 3
    8 14 2
    14 15 1
    9 12 1
    12 15 2
    4 6 1
    

    Sample Output

    10
     

    Data Constraint

     
     

    Hint

    【样例说明】
      轻轨从1号站搭2头牛到5号站,搭3头牛从5好站到8号站,2头牛从8号站到14号站,1头牛从9号站到12号站,1头牛从13号站到14号站,1头牛从14号站到15号站。

     

    分析

    • 线段树覆盖?
    • 贪心?
    • 区间修改,查询最大值

     

    代码

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 struct sb
     8 {
     9     int st,ed,num;
    10 }a[200001];
    11 struct AA
    12 {
    13     int l,r,add,sum,mx;
    14 }t[200100*4];
    15 bool cmp(sb a,sb b)
    16 {
    17     if (a.ed!=b.ed)
    18     return a.ed<b.ed?true:false; 
    19     else return a.st<b.st?true:false;
    20 }
    21 void build(int a,int b,int k)
    22 {
    23     t[k].l=a; t[k].r=b;
    24     if (a==b) return;
    25     int mid=(a+b)/2;
    26     build(a,mid,k*2);
    27     build(mid+1,b,k*2+1);
    28 }
    29 void lazy(int k,int m)
    30 {
    31     if (t[k].add)
    32     {
    33         t[k*2].add+=t[k].add;
    34         t[k*2+1].add+=t[k].add;
    35         t[k*2].mx+=t[k].add;
    36         t[k*2+1].mx+=t[k].add;
    37         t[k].add=0; 
    38     }
    39 }
    40 void change(int x,int y,int z,int k)
    41 {
    42     if (t[k].l>=x&&t[k].r<=y)
    43     {
    44         t[k].add+=z;
    45         t[k].mx+=z;
    46         return;
    47     }
    48     lazy(k,t[k].r-t[k].l+1);
    49     int mid=(t[k].l+t[k].r)/2;
    50     if (y<=mid) change(x,y,z,k*2);
    51     else if (x>mid) change(x,y,z,k*2+1);
    52     else
    53     {
    54         change(x,mid,z,k*2); 
    55         change(mid+1,y,z,k*2+1);
    56     }
    57     t[k].sum=t[k*2].sum+t[k*2+1].sum;
    58     t[k].mx=max(t[k*2].mx,t[k*2+1].mx);
    59 }
    60 int check(int x,int y,int k)
    61 {
    62     if (t[k].l>=x&&t[k].r<=y)
    63         return t[k].mx;
    64     lazy(k,t[k].r-t[k].l+1);
    65     int mid=(t[k].l+t[k].r)/2;
    66     int val=0;
    67     if (x<=mid) val=max(val,check(x,y,k*2));
    68     if (y>mid) val=max(val,check(x,y,k*2+1));
    69     return val;
    70 }
    71 int main()
    72 {
    73     int k,n,c;
    74     scanf("%d%d%d",&k,&n,&c);
    75     for (int i=1;i<=k;i++) scanf("%d%d%d",&a[i].st,&a[i].ed,&a[i].num);
    76     sort(a+1,a+1+k,cmp);
    77     build(1,20001,1);
    78     int ans=0;
    79     for (int i=1;i<=k;i++)
    80     {
    81         int maxn=check(a[i].st,a[i].ed-1,1);
    82         ans+=min(a[i].num,c-maxn);
    83         change(a[i].st,a[i].ed-1,min(a[i].num,c-maxn),1);
    84     }
    85     cout<<ans;
    86     return 0;
    87 }
  • 相关阅读:
    收集常用的.net开源项目
    前端兼容性
    IntelliJ IDEA 14 注册码生成器
    Web开发者的10个最好的云开发环境
    [置顶] 浅谈大型web系统架构
    简单的前端js+ajax 购物车框架(入门篇)
    CSS3 background-size图片自适应
    CSS clip:rect矩形剪裁功能及一些应用介绍
    Aspx 页面生命周期
    Asp.Net页面(母版页)加载顺序
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/11773772.html
Copyright © 2020-2023  润新知