权限题,不给传送门啦!在学校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(); ; }