贪心还是得保证正确再写,不难就挺难受的,这个题的贪心解法讲出来挺容易的,就是按r排序从小到大排,然后分配区间[L,R].这里也从小到大分配,能分配就分配,这样就必定是最优解了.因为我从小到大分配的R,这样的R去分配L,是不影响后面的.但是这样做的复杂度是O(N^2)的.显然太高了.我们不妨用优先队列来优化,优先队列开两维,一维是区间r,二维是权值val.我们从小到大扫描每个位子,看它是不是可以被我优先队列的元素覆盖,当然假如可以被覆盖那我就先用R区间较小的就好了.
ac代码如下:

//不要乱贪心...
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct vv{
    int l,r,v;
}a[N];
bool cmp(vv x,vv y)
{
    if(x.l==y.l&&x.r==y.r)    return x.v<y.v;
    else if(x.l==y.l)         return x.r<y.r;
    else                      return x.l<y.l;
}
int n,m;
struct av{
    int R,V;
    friend bool operator<(struct av x,struct av y)
    {
        if(x.R==y.R)    return x.V>y.V;
        else            return x.R>y.R;
    }
};

int main()
{
    while(cin>>n>>m)
    {
        priority_queue<av>q;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
        }sort(a+1,a+1+m,cmp);
        int id=1,ans=0;
        for(int i=1;i<=n;i++)
        {
            while(a[id].l==i)    {  q.push({a[id].r,a[id].v}),id++;  }
            while(q.size()&&(q.top().R<i||q.top().V==0))   {  q.pop(); }
            if(!q.size())    continue;
            auto t=q.top();
            q.pop();t.V--;
            q.push(t);
            ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}