版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41117236/article/details/82056438
【题目】
1892: kotomi and intersection
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 21 Solved: 8
[Submit][Status][Web Board]
Description
kotomi的英语实在是烂。
一天,kotomi摆弄着尺子。kotomi有n个尺子,尺子上有刻度。
kotomi想知道k个尺子的最大相交区间是多少。
Input
输入包含两个整数n,k(1 <= k <= n <= 300000)
接下来n行,每行两个整数l_i,r_i,表示尺子的左右刻度。左右刻度可以相等。(-10^9 <= l_i <= r_i <= 10^9)
Output
输出包含一个整数
Sample Input
4 2 1 100 40 70 120 130 125 180
Sample Output
31
【题解】
题意:给定n个区间,选择k个区间使其公共区间最大,输出最大公共区间的长度。
思路:运用贪心的思想。先将所有区间按左端点升序排序,使得后边的处理只需要考虑当前的x即可;用minn记录公共区间的最小右端点的最大值即队列的首部,声明一个递增的优先队列存前k-1个区间的右端点,便于minn的更新。最后处理第k到n个区间,求出最大公共区间长度并更新ans与minn即可。
类似题目:cf 1029 C. Maximal Intersection
【代码】
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
struct p{
int x,y;
}f[3*maxn];
bool cmp(p a,p b){return a.x<b.x;}
main()
{
int n,k; scanf("%d%d",&n,&k);
go(i,1,n) scanf("%d%d",&f[i].x,&f[i].y);
sort(f+1,f+n+1,cmp);
priority_queue < int,vector<int>,greater<int> > q;
while(!q.empty()) q.pop();
go(i,1,k-1) q.push(f[i].y);
int ans=0,minn=inf;
if(k>1) minn=q.top();
go(i,k,n)
{
ans=max(ans,min(minn,f[i].y)-f[i].x+1);
if(minn<f[i].y)
{
q.pop();
q.push(f[i].y);
minn=q.top();
}
}
printf("%d\n",ans);
}