1577: [Usaco2009 Feb]庙会捷运Fair Shuttle
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 405 Solved: 230
[ Submit][ Status][ Discuss]
Description
公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N。K(1<=K<=50000)群奶牛希望搭乘这辆公交车。第i群牛一共有Mi(1<=Mi<=N)只.
他们希望从Si到Ei去。
公交车只能座C(1<=C<=100)只奶牛。而且不走重复路线,请计算这辆车最多能满足多少奶牛听要求。
注意:对于每一群奶牛,可以部分满足,也可以全部满足,也可以全部不满足。
Input
第1行: 三个整数: K,N,C。 由空格隔开。
第2..K+1行:第i+1行,告诉你第i组奶牛的信息: S_i, E_i and M_i。由空格隔开。
Output
一行:可以在庙会乘坐捷运的牛的最大头数
Sample Input
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 5 2
13 14 1
5 8 3
8 14 2
14 15 1
9 12 1
12 15 2
4 6 1
Sample Output
10
HINT
捷运可以把2头奶牛从展台1送到展台5,3头奶牛从展台5到展台8, 2头奶牛从展台8 到展台14,1头奶牛从展台9送到展台12,一头奶牛从展台13送到展台14, 一头奶牛从 14送到15。
Source
哇,自己有点菜。
看了题解的贪心策略之后都想不到做法
其实这道题目本身不难
首先将区间右端点排序
按照这样的顺序选择(贪心)
能选就选
选之前查一下区间max,看最多能乘坐多少
然后区间修改一下就可以了
#include<cstdio>
#include<cstring>
#include<algorithm>
const int N=20007,K=50007;
struct node
{
int l,r,max,lazy;
}e[N*4];
struct edgt
{
int l,r,x;
}a[K];
#define lson ro<<1
#define rson ro<<1|1
#define col e[ro].lazy
inline int max(int a,int b)
{
return a>b?a:b;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void pushup(int ro)
{
e[ro].max=max(e[lson].max,e[rson].max);
}
void build(int ro,int l,int r)
{
e[ro].l=l;e[ro].r=r;
if(l==r) return;
int mid=(l+r)>>1;
build(lson,l,mid);build(rson,mid+1,r);
}
inline void pushdown(int ro)
{
if(col)
{
e[lson].max+=col;
e[rson].max+=col;
e[lson].lazy+=col;
e[rson].lazy+=col;
col=0;
}
}
inline int read()
{
int ans=0;char t=getchar();
while(t<'0'||t>'9') t=getchar();
while(t>='0'&&t<='9') ans=ans*10+t-'0',t=getchar();
return ans;
}
inline bool cmp(edgt a,edgt b)
{
return a.r<b.r;
}
int query(int ro,int l,int r)
{
if(l<=e[ro].l&&e[ro].r<=r)
{
return e[ro].max;
}
pushdown(ro);
int mid=(e[ro].l+e[ro].r)>>1;
int ans=-1;
if(l<=mid) ans=max(query(lson,l,r),ans);
if(r>mid) ans=max(query(rson,l,r),ans);
return ans;
}
void change(int ro,int l,int r,int k)
{
if(l<=e[ro].l&&e[ro].r<=r)
{
e[ro].max+=k;col+=k;
return;
}
pushdown(ro);
int mid=(e[ro].l+e[ro].r)>>1;
if(l<=mid) change(lson,l,r,k);
if(r>mid) change(rson,l,r,k);
pushup(ro);
}
int main()
{
int k=read(),n=read(),c=read();
build(1,1,n);
for(int i=1;i<=k;i++) a[i].l=read(),a[i].r=read()-1,a[i].x=read();
std::sort(a+1,a+1+k,cmp);
int ans=0;
for(int i=1;i<=k;i++)
{
int tt=min(c-query(1,a[i].l,a[i].r),a[i].x);
ans+=tt;
if(tt)change(1,a[i].l,a[i].r,tt);
}
printf("%d\n",ans);
return 0;
}