Description
定义一个区间(l,r)的长度为r-l,空区间的长度为0。
给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。
Input
第一行包含两个正整数n,k(1<=k<=n<=1000000),表示区间的数量。
接下来n行,每行两个正整数l,r(1<=l< r< =10^9),依次表示每个区间。
Output
第一行输出一个整数,即最大长度。
第二行输出k个正整数,依次表示选择的是输入文件中的第几个区间。
若有多组最优解,输出任意一组。
Sample Input
6 3
3 8
4 12
2 6
1 10
5 9
11 12
Sample Output
4
1 2 4
题解
按区间左端点l从小到大排序,按右端点r维护前k大,用小根堆。
代码
#include<bits/stdc++.h>
typedef long long ll;
const int mod=1000000007;
const int N=500010;
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct node{int l,r,id;}a[1000005];
int n,ans,k;
struct CMP{
bool operator()(node a,node b)
{
return a.r>b.r;
}
};
priority_queue<node,vector<node>,CMP>q;
inline bool cmp(node a,node b){return a.l<b.l;}
void print()
{
while (!q.empty())
{
printf("%d ",q.top().id);
q.pop();
}
}
int main()
{
n=read();k=read();
for (int i=1;i<=n;i++)
{
a[i].l=read();a[i].r=read();a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;i++)
{
q.push(a[i]);
if (i>k) q.pop();
if (i>=k) ans=max(ans,q.top().r-a[i].l);
}
while (!q.empty()) q.pop();
printf("%d\n",ans);
for (int i=1;i<=n;i++)
{
q.push(a[i]);
if (i>k) q.pop();
if (i>=k) if (ans==q.top().r-a[i].l) return print(),0;
}
}