![在这里插入图片描述](https://img-blog.csdnimg.cn/20190821193936794.png)
题目分析:
- 经典的区间选点问题
- 每次将树种到最右边,对答案更优,因为可以覆盖更多的区间
- 将区间按照
r
r
r越小排序,每次查看当前区间种的树是否够,若不够,从后往前种,注意只能在没种的上面种
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 30010
#define maxm 5010
int n,m;
bool vis[maxn];
struct node {
int l,r,t;
}e[maxm];
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
inline bool cmp_(node aa,node bb) {
if(aa.r==bb.r) return aa.l < bb.l;
return aa.r < bb.r;
}
void readda_() {
n=read_();
m=read_();
for(int i=1;i<=m;++i) {
e[i].l=read_();e[i].r=read_();e[i].t=read_();
}
sort(e+1,e+m+1,cmp_);
memset(vis,false,sizeof(vis));
int ans=0;
ans+=e[1].t;
for(int i=e[1].r,j=1;j<=e[1].t;++j,--i) {
vis[i]=true;
}
for(int i=2;i<=m;++i) {
int cnt=0;
for(int j=e[i].l;j<=e[i].r;++j) {
if(vis[j]) {
++cnt;
if(cnt>=e[i].t) break;
}
}
if(cnt<e[i].t) {
for(int j=e[i].r;j>=e[i].l;--j) {
if(!vis[j]) vis[j]=true,++cnt,++ans;
if(cnt>=e[i].t) break;
}
}
}
printf("%d",ans);
}
int main() {
freopen("a.txt","r",stdin);
readda_();
return 0;
}