[USACO09FEB]廟會班車Fair Shuttle
阿新 • • 發佈:2017-07-15
pan air bool query can 思想 說明 ans 奶牛
題目描述
逛逛集市,兌兌獎品,看看節目對農夫約翰來說不算什麽,可是他的奶牛們非常缺乏鍛煉——如果要逛完一整天的集市,他們一定會筋疲力盡的。所以為了讓奶牛們也能愉快地逛集市,約翰準備讓奶牛們在集市上以車代步。但是,約翰木有錢,他租來的班車只能在集市上沿直線跑一次,而且只能停靠N(1 ≤N≤20000)個地點(所有地點都以1到N之間的一個數字來表示)。現在奶牛們分成K(1≤K≤50000)個小組,第i 組有Mi(1 ≤Mi≤N)頭奶牛,他們希望從Si跑到Ti(1 ≤Si<Ti≤N)。
由於班車容量有限,可能載不下所有想乘車的奶牛們,此時也允許小裏的一部分奶牛分開乘坐班車。約翰經過調查得知班車的容量是C(1≤C≤100),請你幫助約翰計劃一個盡可能滿足更多奶牛願望的方案。
輸入輸出格式
輸入格式:
【輸入】
第一行:包括三個整數:K,N和C,彼此用空格隔開。
第二行到K+1行:在第i+1行,將會告訴你第i組奶牛的信息:Si,Ei和Mi,彼
此用空格隔開。
輸出格式:
【輸出】
第一行:可以坐班車的奶牛的最大頭數。
輸入輸出樣例
輸入樣例#1: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輸出樣例#1:
10
說明
【樣例說明】
班車可以把2頭奶牛從1送到5,3頭奶牛從5送到8,2頭奶牛從8送到14,1頭
奶牛從9送到12,1頭奶牛從13送到14,1頭奶牛從14送到15。
題解:
線段樹
根據貪心思想,按結束點從小到大排序,對於每組牛,只要滿足加入x只後區間最大值小於c即可。
用線段樹維護區間最大值,區間加,記得修改和詢問時終點要減一(終點已下車)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 struct Node 7 { 8 int s,t,m; 9 }a[50001]; 10 int lazy[80001],c1[80001],k,n,c,ans;11 bool cmp(Node a,Node b) 12 { 13 return (a.t<b.t||(a.t==b.t&&a.s>b.s)); 14 } 15 void pushdown(int rt) 16 { 17 if (lazy[rt]) 18 { 19 c1[rt*2]+=lazy[rt]; 20 lazy[rt*2]+=lazy[rt]; 21 c1[rt*2+1]+=lazy[rt]; 22 lazy[rt*2+1]+=lazy[rt]; 23 lazy[rt]=0; 24 } 25 } 26 int query(int rt,int l,int r,int L,int R) 27 { 28 if (l>=L&&r<=R) 29 { 30 return c1[rt]; 31 } 32 pushdown(rt); 33 int mid=(l+r)/2; 34 int s=0; 35 if (L<=mid) s=max(s,query(rt*2,l,mid,L,R)); 36 if (R>mid) s=max(s,query(rt*2+1,mid+1,r,L,R)); 37 return s; 38 } 39 void add(int rt,int l,int r,int L,int R,int d) 40 { 41 if (l>=L&&r<=R) 42 { 43 c1[rt]+=d; 44 lazy[rt]+=d; 45 return; 46 } 47 pushdown(rt); 48 int mid=(l+r)/2; 49 if (L<=mid) add(rt*2,l,mid,L,R,d); 50 if (R>mid) add(rt*2+1,mid+1,r,L,R,d); 51 c1[rt]=max(c1[rt*2],c1[rt*2+1]); 52 } 53 int main() 54 {int i,j; 55 cin>>k>>n>>c; 56 for (i=1;i<=k;i++) 57 { 58 scanf("%d%d%d",&a[i].s,&a[i].t,&a[i].m); 59 a[i].t--; 60 } 61 sort(a+1,a+k+1,cmp); 62 for (i=1;i<=k;i++) 63 { 64 int x=min(a[i].m,c-query(1,1,n,a[i].s,a[i].t)); 65 add(1,1,n,a[i].s,a[i].t,x); 66 ans+=x; 67 } 68 cout<<ans; 69 }
[USACO09FEB]廟會班車Fair Shuttle