zcmu 1892: kotomi and intersection(贪心)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/82056438