1. 程式人生 > >[USACO09FEB]廟會班車Fair Shuttle

[USACO09FEB]廟會班車Fair Shuttle

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