您的位置:首页 > Web前端

Codeforces Round #390 (Div. 2) D. Fedor and coupons 贪心+优先队列

2017-01-07 14:13 417 查看
按左端点排序,排序后拿一个优先队列维护一下右端点的最小值即可。优先队列里面始终有且仅有k条线段的右端点信息。

#include <bits/stdc++.h>
using namespace std;
const int maxn=300005;
int n,k,res,p,rl,rr;
struct ss {
int l,r,id;
} seg[maxn];
bool cmp(ss s1,ss s2) {
return s1.l==s2.l?s1.r<s2.r:s1.l<s2.l;
}
priority_queue<int,vector<int>,greater<int> >  que;
int main()
{
scanf("%d%d",&n,&k);
for (int i=0;i<n;++i) {
scanf("%d%d",&seg[i].l,&seg[i].r);
seg[i].id=i+1;
}
sort(seg,seg+n,cmp);
for (int i=0;i<k-1;++i)
que.push(seg[i].r);
p=-1;
for (int i=k-1;i<n;++i) {
que.push(seg[i].r);
if (que.top()-seg[i].l+1>res) {
res=que.top()-seg[i].l+1;
rr=que.top();
rl=seg[i].l;
p=i;
}
que.pop();
}
if (p==-1) {
puts("0");
for (int i=0;i<k;++i)
printf("%d%c",i+1,i+1==k?'\n':' ');
} else {
printf("%d\n",res);
int cnt=0;
for (int i=0;i<n;++i) {
if (seg[i].l<=rl&&seg[i].r>=rr) {
printf("%d%c",seg[i].id,cnt+1==k?'\n':' ');
++cnt;
if (cnt==k)
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: