BZOJ 5102: [POI2018]Prawnicy

原创 2018年04月16日 10:19:52

Description

定义一个区间(l,r)的长度为r-l,空区间的长度为0。
给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。

Input

第一行包含两个正整数n,k(1<=k<=n<=1000000),表示区间的数量。
接下来n行,每行两个正整数l,r(1<=l

Output

第一行输出一个整数,即最大长度。
第二行输出k个正整数,依次表示选择的是输入文件中的第几个区间。
若有多组最优解,输出任意一组。

Sample Input

6 3

3 8

4 12

2 6

1 10

5 9

11 12

Sample Output

4

1 2 4

分析

枚举左端点,那么最优的右端点显然是把所有左端点不大于该点的区间加入,然后取第k大的右端点。
那么我们只要把区间按照左端点排序,然后用一个堆来维护即可。

代码

#include <bits/stdc++.h>

const int N = 1000005;

struct Data
{
    int l,r,id;
}a[N];

bool cmp(Data a,Data b)
{
    return a.l < b.l;
}


std::priority_queue<int> Q;

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;
}

int main()
{
    int n = read(), m = read();
    for (int i = 1; i <= n; i++)
    {
        a[i].l = read(), a[i].r = read(), a[i].id = i;
    }
    std::sort(a + 1, a + n + 1, cmp);
    int ans = 0, x, y;
    for (int i = 1; i <= n; i++)
    {
        Q.push(-a[i].r);
        if (Q.size() > m)
            Q.pop();
        if (Q.size() == m && -Q.top() - a[i].l > ans)
            ans = -Q.top() - a[i].l, x = a[i].l, y = -Q.top();
    }
    printf("%d\n",ans);
    for (int i = 1; i <= n; i++)
        if (a[i].l <= x && a[i].r >= y)
        {
            printf("%d ", a[i].id);
            m--;
            if (!m)
                break;
        }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ypxrain/article/details/79957151

【bzoj5102】[POI2018]Prawnicy

Description定义一个区间(l,r)的长度为r-l,空区间的长度为0。 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。 Input第一行包含两个正整数n,k(1...
  • w_yqts
  • w_yqts
  • 2017-12-29 16:03:21
  • 91

bzoj5102 [POI2018]Prawnicy

【题意】 给出n" role="presentation" style="position: relative;">nnn个区间,找出其中的k" role="presentation" style=...
  • leolyun
  • leolyun
  • 2018-02-01 00:19:49
  • 38

bzoj 5102: [POI2018]Prawnicy

题意 定义一个区间(l,r)的长度为r-l,空区间的长度为0。 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。 题解 明显地,一个极大区间的两个端点肯定是给出区间的端点 ...
  • qq_36797743
  • qq_36797743
  • 2018-02-23 15:51:41
  • 38

bzoj 5102: [POI2018]Prawnicy 贪心+堆

题意 定义一个区间(l,r)的长度为r-l,空区间的长度为0。 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。 n&amp;lt;=1000000 分析 为什么同为一个...
  • qq_33229466
  • qq_33229466
  • 2018-04-15 17:25:40
  • 16

BZOJ5100[POI2018]Plan metra 构造

首先可以发现在11到nn的链上的点的d1+d2d1+d2是最小的 这样我们可以求出11到nn的链 对于其他的点 他一定与这条链的上点链接 可以发现 对于点ii 和11到nn上的点j 有d1[i]−...
  • Devil_Gary
  • Devil_Gary
  • 2017-11-29 11:00:32
  • 431

BZOJ 5099([POI2018]Pionek-极角排序)

题意:有n个向量,每个向量可以选择取或者不取,要求选一些向量,使得它们和最大。#include using namespace std; #define For(i,n) for(int i=1;i...
  • nike0good
  • nike0good
  • 2017-12-11 15:40:24
  • 247

bzoj 5099: [POI2018]Pionek

题意 给你一些向量 选出其中一些使得他们的和最大 题解 这题做了一个上午 一个结论:向量和的长度等于所有向量在其方向上投影的长度和。 因此想要向量和的长度最大,即要选择所有在...
  • qq_36797743
  • qq_36797743
  • 2018-02-22 11:28:41
  • 52

[bzoj5101] [POI2018]Powód

题目大意有一个n*m的网格图,给定相邻的格子之间墙的高度,并且默认边界的墙的高度是无穷大的。再给定水位上限H,问有多少种可能的水位。n*m≤500000 H≤1,000,000,000分析可以把...
  • WorldWide_D
  • WorldWide_D
  • 2017-12-24 16:01:02
  • 177

BZOJ5102 [POI2018]Prawnicy

标签:堆,构造,贪心 题目 题目传送门 Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0。 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。...
  • qwerty1125
  • qwerty1125
  • 2018-04-07 16:41:20
  • 26

【BZOJ5102】【POI2018】Prawnicy

【题目链接】点击打开链接【思路要点】从左到右枚举交集的左端点,用堆维护最大的\(K\)个右端点即可。时间复杂度\(O(NLogN)\)。【代码】#include&amp;lt;bits/stdc++....
  • qq_39972971
  • qq_39972971
  • 2018-03-18 19:42:05
  • 18
收藏助手
不良信息举报
您举报文章:BZOJ 5102: [POI2018]Prawnicy
举报原因:
原因补充:

(最多只允许输入30个字)