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"); }