您的位置:首页 > Web前端

Codeforces 754 D Fedor and coupons【优先队列】

2017-03-02 11:53 369 查看

题目:http://codeforces.com/contest/754/problem/D

题意:

从n条线段中取出恰好k条使得交集长度尽可能长,输出最优值和方案。

分析:

感觉这种题做过好多次了,贪心+优先队列就可做。

根据左端点排序,然后依次插入右端点,直到队列中元素有k个,然后当前插入的左端点是最大的,队首的就是右端点最小的。这样维护一下即可。

set和优先队列都可以,set似乎更方便些~~

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

struct Coupon {
int l;
int r;
int id;

Coupon(int l, int r, int id): l(l), r(r), id(id) {}

bool operator<(const Coupon& c) {
return l < c.l;
}
};

int main() {
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<Coupon> e;
for (int i = 0; i < n; i++) {
int l, r;
cin >> l >> r;
e.push_back(Coupon(l, r, i));
}
sort(e.begin(), e.end());
set<pii> q;
int ans = 0;
int when = -1;
for (int i = 0; i < e.size(); i++) {
q.insert(pii(e[i].r, e[i].id));
while (q.size() > k)
q.erase(q.begin());
if (q.size() == k) {
int cur = q.begin()->first - e[i].l + 1;
if (cur > ans) {
ans = cur;
when = i;
}
}
}
cout << ans << endl;
if (ans == 0) {
for (int i = 1; i <= k; i++)
cout << i << " ";
cout << endl;
return 0;
}
q.clear();
for (int i = 0; i < e.size(); i++) {
q.insert(pii(e[i].r, e[i].id));
while (q.size() > k)
q.erase(q.begin());
if (when == i) {
for (auto kv : q)
cout << kv.second + 1 << " ";
cout << endl;
return 0;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: