元旦晚会
题目背景
玛雅人预言的世界末日没有发生,我们迎来了地球的第五个太阳纪。
学校将要举办第五个太阳纪的第一次元旦晚会。Brett 的班级要参加,并且还表演节目。
题目描述
Brett 班的节目是这样的:全班 n n n 个同学排成一排,同学们手拿话筒,齐唱《喜洋洋与灰太狼》(这个节目看起来有点二) 。
Brett 班的同学分成了 m m m 个声部,一个声部由连续的同学组成,第 i i i 个声部由 a i a_i ai 到 b i b_i bi 之间的同学组成(包括 a i a_i ai 和 b i b_i bi )
但是一个同学有可能同时属于多个声部,且有可能有同学不属于任何一个声部。为了保证演唱效果,第 i i i 个声部必须至少有 c i c_i ci 个同学持有话筒(即第 i i i 个声部持有话筒的同学数大于等于 c i c_i ci)。
请你算出 Brett 班最少需要几个话筒。
输入格式
第一行 2 2 2 个正整数 n , m n,m n,m。
以下 m m m 行,每行 3 3 3 个正整数 a i , b i , c i a_i, b_i, c_i ai,bi,ci。
输出格式
一个正整数表示满足要求的最少话筒数。
样例 #1
样例输入 #1
11 5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1
样例输出 #1
6
提示
对于 100 % 100\% 100% 的数据,保证 n ≤ 30000 n \le 30000 n≤30000, m ≤ 5000 m \le 5000 m≤5000, 1 ≤ a i < b i ≤ n 1 \le a_i < b_i \le n 1≤ai<bi≤n, c i ≤ b i − a i + 1 c_i \le b_i - a_i + 1 ci≤bi−ai+1。
思路
你不发现这道题很像我之前写的:序列。
代码
/*
1 2 3 4 5 6 7 8 9 10
|-|
1
|-|
1
|--------|
3
|------|
3
最短长度就是 5 6 7 8
贪心策略:尽量在交界地方放元素,保证元素的总个数最少
所以我们对左端点进行排序
*/
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 3e5+10;
struct E{
int x,y,w;
bool operator<(const E& t)const{
return x<t.x;
}
}e[N];
int n,m;
int ans,cnt;
bool st[N];
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>e[i].x>>e[i].y>>e[i].w;
}
sort(e+1,e+1+n);
for(int i=n;i>=1;i--){
// cout<<e[i].x<<" "<<e[i].y<<endl;
cnt=0;//代表现在区间内已经有cnt个数了
for(int j=e[i].y;j>=e[i].x;j--){//统计之前已有数的个数。
if(st[j]){
cnt++;
}
}
if(cnt>=e[i].w)continue;//如果已经满足这个区间的约束,那么就不用再加了,开始看下一个区间
for(int j=e[i].x;j<=e[i].y;j++){
if(!st[j]){
cnt++;
ans++;
st[j]=true;
if(cnt>=e[i].w)break;
}
}
}
cout<<ans;
return 0;
}