题目背景

玛雅人预言的世界末日没有发生,我们迎来了地球的第五个太阳纪。

学校将要举办第五个太阳纪的第一次元旦晚会。Brett的班级要参加,并且还表演节目。

题目描述

Brett 班的节目是这样的:全班 n个同学排成一排,同学们手拿话筒,齐唱《喜洋洋与灰太狼》。(这个节目看起来有点二) 。

Brett班的同学分成了m个声部,一个声部由连续的同学组成,第i个声部由a[i]到b[i]之间的同学组成(包括a[i] b[i])

但是一个同学有可能同时属于多个声部,且有可能有同学不属于任何一个声部。 为了保证演唱效果,第 i 个声部必须至少有c[i]个同学持有话筒。(即第i个声部持有话筒的同学数大于等于 c[i])

请你算出Brett班最少需要几个话筒。

输入格式

第一行 2 个正整数 n,m

以下m行,每行3个正整数 a[i] b[i] c[i]

输出格式

一个正整数 满足要求的最少话筒数

输入输出样例

输入 #1复制
11 5 
3 7 3 
8 10 3 
6 8 1 
1 3 1 
10 11 1 
输出 #1复制
6 

说明/提示

n<=30000 m<=5000

1≤a[i]<b[i]≤n ;c[i]≤b[i]-a[i]+1


题解
所有节目有a开始,b结束,c人数
把所有节目按a从小到大排
每次先遍历【a,b】计算缺的人数
如果缺,你们从【a,b】的后面开始选人
→这样就可以保证每次后面选的人最少←
#include <bits/stdc++.h>
using namespace std;

const int N=3e5+10;

struct Stu{
	int a,b,c;
};
Stu stu[N];

bool cmp(Stu a,Stu b){
	if(a.b!=b.b) return a.b<b.b;
	else a.a<b.a;
}
int n,m,hav[N],ans;

int main(int argc, char** argv) {
	cin>>n>>m;
	for(int i=0;i<m;i++){
		cin>>stu[i].a>>stu[i].b>>stu[i].c;
	}
	sort(stu,stu+m,cmp);
	for(int i=0;i<m;i++){
		int cnt=0;
		for(int j=stu[i].a;j<=stu[i].b;j++){
			if(hav[j]) cnt++;
		}
		if(cnt<stu[i].c){
			for(int j=stu[i].b;j>=stu[i].a&&cnt<stu[i].c;j--){
				if(!hav[j]) hav[j]=1, cnt++,ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}