列表

详情


NC14136. 监视任务

描述

𝑅𝑒𝑘𝑖在课余会接受一些民间的鹰眼类委托,即远距离的狙击监视防卫。
𝑅𝑒𝑘𝑖一共接到了𝑚份委托,这些委托与𝑛个直线排布的监视点相关。
第𝑖份委托的内容为:对于区间[𝑙𝑖, 𝑟𝑖]中的监视点,至少要防卫其中的𝑘𝑖个。
𝑅𝑒𝑘𝑖必须完成全部委托,并且希望选取尽量少的监视点来防卫。

输入描述

第一行,两个正整数𝑛,𝑚。
接下来𝑚行,每行三个整数𝑙𝑖,𝑟𝑖,𝑘𝑖

输出描述

一行,一个整数,即所需防卫的最少监视点数量。

示例1

输入:

11 5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 438ms, 内存消耗: 30816K, 提交时间: 2018-09-16 14:59:49

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N = 500005;
int k[N];
struct node {
	int l,r,val;
	bool operator < (const node &t) {
		return r < t.r || (r == t.r && l > t.l);
	}
} a[2 * N];

int main() {
	int n,m;
	scanf("%d %d",&n,&m);
	if(m) {
		rep(i,1,m)
			scanf("%d %d %d",&a[i].l,&a[i].r,&a[i].val);
		sort(a+1,a+m+1);
		int f,l = 0,z = 1;
		rep(i,1,m) {
			for(z; z<=a[i].r; ++z)
				k[l++]=z;
			f = lower_bound(k,k+l,a[i].l) - k;
			f = a[i].r - a[i].l + 1 - l + f;
			if(f < a[i].val)
				l -= a[i].val - f;
		}
		while(z <= n) k[l++]=z++;
		printf("%d\n",n - l);
	} else
		puts("0");
}

上一题