BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution

时间:2023-03-08 20:26:18
BZOJ1577  USACO 2009 Feb Gold 1.Fair Shuttle Solution

权限题,不给传送门啦!在学校OJ上交的..

有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀。

正经题解:

首先,我们可以由「显然成立法」得出,只要我们按照右端点排序,然后能塞多少就塞多少就一定是最优哒!

你们可以YY一下,如果一堆牛能下车就赶紧下是不是可以得出最优的呢,我感觉不对但是他们都说对

然后就是很基本的线段树维护区间的查询和修改了。

需要注意的一个小地方是如果是线段树修改区间右端点是要-1的,这个很显然。

下面是具体实现:

 //OJ 1623
 //by Cydiater
 //2016.9.10
 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <string>
 #include <algorithm>
 #include <queue>
 #include <map>
 #include <ctime>
 #include <cmath>
 #include <cstdlib>
 #include <iomanip>
 using namespace std;
 #define ll long long
 #define up(i,j,n)        for(int i=j;i<=n;i++)
 #define down(i,j,n)        for(int i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline int read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 ;
 struct SegTree{
     int delta,v;
 }t[MAXN<<];
 struct Query{
     int leftt,rightt,v;
 }q[MAXN];
 namespace solution{
     inline bool cmp(Query a,Query b){return a.rightt==b.rightt?a.leftt>b.leftt:a.rightt<b.rightt;}
     inline void downit(int node){
         t[node<<].delta+=t[node].delta;t[node<<|].delta+=t[node].delta;
         t[node<<].v+=t[node].delta;t[node<<|].v+=t[node].delta;
         t[node].delta=;
     }
     void build(int leftt,int rightt,int root){
         if(leftt==rightt){
             t[root].delta=;t[root].v=C;
             return;
         }
         t[root].delta=;t[root].v=C;
         ;
         build(leftt,mid,root<<);
         build(mid+,rightt,root<<|);
     }
     int get(int leftt,int rightt,int root){
         downit(root);
         if(leftt>y||rightt<x)        return oo;
         if(leftt>=x&&rightt<=y)        return t[root].v;
         ;
         ),,rightt,root<<|));
     }
     void updata(int leftt,int rightt,int root){
         downit(root);
         if(leftt>y||rightt<x)        return;
         if(leftt>=x&&rightt<=y){
             t[root].delta-=v;
             t[root].v-=v;
             return;
         }
         ;
         updata(leftt,mid,root<<);
         updata(mid+,rightt,root<<|);
         t[root].v=min(t[root<<].v,t[root<<|].v);
     }
     void init(){
         K=read();N=read();C=read();
         up(i,,K){
             q[i].leftt=read();q[i].rightt=read()-;q[i].v=read();
         }
         sort(q+,q+K+,cmp);
         build(,N,);
     }
     void slove(){
         up(i,,K){
             x=q[i].leftt;y=q[i].rightt;v=q[i].v;
             ,N,);
             num=min(v,num);
             if(num){
                 ans+=num;v=num;
                 updata(,N,);
             }
         }
     }
     void output(){
         cout<<ans<<endl;
     }
 }
 int main(){
     //freopen("input.in","r",stdin);
     using namespace solution;
     init();
     slove();
     output();
     ;
 }