Codeforces Round #390 (Div. 2)D Fedor and coupons

来源:互联网 发布:行知职业技术学校 编辑:程序博客网 时间:2024/06/06 09:31

题目大意:

       给你n个区间,求k个区间的最大并区间长度。

题目解法:

      贪心,不断想优先队列中保存内容,保证每次队列顶端的右值最大,不断修正左区间。最后按照最优的左端点和右端点,寻找答案就行。

代码:

#include "iostream"#include "cstdio"#include "math.h"#include "algorithm"#include "string"#include "string.h"#include "vector"#include "map"#include "queue"using namespace std;int n, k;struct Node {int left, right, id;friend bool operator <(Node a, Node b) {return a.right > b.right;}}node[300010];bool cmp(Node a, Node b) {if (a.left == b.left)return a.right > b.right;return a.left < b.left;}int main() {scanf("%d %d", &n, &k);for (int i = 1;i <= n;i++) {scanf("%d %d", &node[i].left, &node[i].right);node[i].id = i;}int maxnum = 0, ansleft, ansright;sort(node + 1, node + n + 1, cmp);priority_queue<Node>que;for (int i = 1;i <= n;i++) {int left = node[i].left;que.push(node[i]);if (que.size() > k)que.pop();int right = que.top().right;if (que.size() == k&&right - left + 1 > maxnum) {maxnum = right - left + 1;ansleft = left;ansright = right;}}printf("%d\n", maxnum);if (maxnum == 0) {for (int i = 1;i <= k;i++) {printf("%d ", i);}}else {for (int i = 1, j = 0;i <= n&&j < k;i++) {if (node[i].left <= ansleft&&node[i].right >= ansright) {printf("%d ", node[i].id);j++;}}}return 0;}

0 0
原创粉丝点击