权限题,不给传送门啦!在学校OJ上交的..
有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀。
正经题解:
首先,我们可以由「显然成立法」得出,只要我们按照右端点排序,然后能塞多少就塞多少就一定是最优哒!
你们可以YY一下,如果一堆牛能下车就赶紧下是不是可以得出最优的呢,我感觉不对但是他们都说对
然后就是很基本的线段树维护区间的查询和修改了。
需要注意的一个小地方是如果是线段树修改区间右端点是要-1的,这个很显然。
下面是具体实现:
1 //OJ 1623 2 //by Cydiater 3 //2016.9.10 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 #include <string> 8 #include <algorithm> 9 #include <queue> 10 #include <map> 11 #include <ctime> 12 #include <cmath> 13 #include <cstdlib> 14 #include <iomanip> 15 using namespace std; 16 #define ll long long 17 #define up(i,j,n) for(int i=j;i<=n;i++) 18 #define down(i,j,n) for(int i=j;i>=n;i--) 19 const int MAXN=2e5+5; 20 const int oo=0x3f3f3f3f; 21 inline int read(){ 22 char ch=getchar();int x=0,f=1; 23 while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();} 24 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 25 return x*f; 26 } 27 int K,N,C,x,y,v,ans=0; 28 struct SegTree{ 29 int delta,v; 30 }t[MAXN<<3]; 31 struct Query{ 32 int leftt,rightt,v; 33 }q[MAXN]; 34 namespace solution{ 35 inline bool cmp(Query a,Query b){return a.rightt==b.rightt?a.leftt>b.leftt:a.rightt<b.rightt;} 36 inline void downit(int node){ 37 t[node<<1].delta+=t[node].delta;t[node<<1|1].delta+=t[node].delta; 38 t[node<<1].v+=t[node].delta;t[node<<1|1].v+=t[node].delta; 39 t[node].delta=0; 40 } 41 void build(int leftt,int rightt,int root){ 42 if(leftt==rightt){ 43 t[root].delta=0;t[root].v=C; 44 return; 45 } 46 t[root].delta=0;t[root].v=C; 47 int mid=(leftt+rightt)>>1; 48 build(leftt,mid,root<<1); 49 build(mid+1,rightt,root<<1|1); 50 } 51 int get(int leftt,int rightt,int root){ 52 downit(root); 53 if(leftt>y||rightt<x) return oo; 54 if(leftt>=x&&rightt<=y) return t[root].v; 55 int mid=(leftt+rightt)>>1; 56 return min(get(leftt,mid,root<<1),get(mid+1,rightt,root<<1|1)); 57 } 58 void updata(int leftt,int rightt,int root){ 59 downit(root); 60 if(leftt>y||rightt<x) return; 61 if(leftt>=x&&rightt<=y){ 62 t[root].delta-=v; 63 t[root].v-=v; 64 return; 65 } 66 int mid=(leftt+rightt)>>1; 67 updata(leftt,mid,root<<1); 68 updata(mid+1,rightt,root<<1|1); 69 t[root].v=min(t[root<<1].v,t[root<<1|1].v); 70 } 71 void init(){ 72 K=read();N=read();C=read(); 73 up(i,1,K){ 74 q[i].leftt=read();q[i].rightt=read()-1;q[i].v=read(); 75 } 76 sort(q+1,q+K+1,cmp); 77 build(1,N,1); 78 } 79 void slove(){ 80 up(i,1,K){ 81 x=q[i].leftt;y=q[i].rightt;v=q[i].v; 82 int num=get(1,N,1); 83 num=min(v,num); 84 if(num){ 85 ans+=num;v=num; 86 updata(1,N,1); 87 } 88 } 89 } 90 void output(){ 91 cout<<ans<<endl; 92 } 93 } 94 int main(){ 95 //freopen("input.in","r",stdin); 96 using namespace solution; 97 init(); 98 slove(); 99 output(); 100 return 0; 101 }
时间: 2024-09-28 20:18:13