目录:
题目:
分析:
听我们队中的很多dalao说,可以用贪心+线段树优化,只能%%%,但小编想说,贪心也可以很优秀:
代码很短,但炒鸡难理解,在洛谷上什么注释都没有,我硬是花了一下午才理解,但是,当你们看到此文时,那么就是赚到了:
首先说下,这道题跟活动安排很想,所以我们可以将站点比作时间,同时需要点队列思维,在讲代码时会用到,请各位大佬等下翻回看:
这一组的数据为:上车:3 下车:6 牛数:2
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
struct cow{
int b,e,num;
}x[50001];
int h[20001];
bool cmp(cow a,cow b)
{
if(a.e==b.e) return a.b<b.b;
else return a.e<b.e;
}
int ans;
int main()
{
int n=read(),m=read(),c=read();
for(int i=1;i<=n;i++) x[i].b=read(),x[i].e=read(),x[i].num=read();
sort(x+1,x+1+n,cmp);//按照下车时间排序,如果相等,那再按上车时间排序
int w,p;
for(int i=1;i<=n;i++)
{
//h类似于一个时间戳,记录下每次车子会停下的时间
if(x[i].b<h[1]) continue;//当车子不会停留时,因为之前排过序,所以pass
w=1;//w用来求当前这一组我们可以上多少头牛
while(w<=x[i].num&&w<=c&&x[i].b>=h[w]) w++;
//对于x[i].b>=h[w],表示我们之前车子还会有牛下站,而我们当前组的牛就可以上了
w--;
//p用来找到第一个大于上车时间的时间..
for(p=1;p<=c;p++)
if(h[p]>x[i].b) break;
p-=w;//求出我们滚动操作的起始位置,可以看图了↑
while(h[p+w]<x[i].e&&p+w<=c) h[p]=h[p+w],p++;//滚动-important
for(int j=1;j<=w;j++)
h[p++]=x[i].e;//把我们这组上车的牛的终点记录下来
ans+=w;//累加求解
}
printf("%d",ans);
return 0;
}