bzoj 5102: [POI2018]Prawnicy

10人阅读 评论(0) 收藏 举报
分类:

题意:

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

题解:

一眼主席树(大sb)
其实线段树即可,按左端点排序,依次插入线段树,然后就可以在线段树上二分得到右端点。
然后传说会tle,将线段树换成堆即可,维护第k大的右端点。
卡时过。
code:

#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
    int l,r,num;
}a[1000010];
int n,k;
bool cmp(Node a,Node b) {return a.l<b.l;}
struct node{
    int x,r;
    node() {}
    node(int a,int b) {x=a;r=b;}
};
bool operator < (node a,node b) {return a.r>b.r;}
priority_queue<node> q;
int main()
{
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%d %d",&a[i].l,&a[i].r),a[i].num=i;
    sort(a+1,a+n+1,cmp);
    int ans=0,num=0,x=-1;
    for(int i=1;i<=n;i++)
    {
        if(k==1)
        {
            int len=a[i].r-a[i].l;
            if(ans<len) x=a[i].num,ans=len;
        }
        else if(num==k-1)
        {
            int len=min(q.top().r,a[i].r)-a[i].l;
            if(ans<len) x=a[i].num,ans=len;
        }
        num++;q.push(node(a[i].num,a[i].r));
        if(num==k) num--,q.pop();
    }
    printf("%d\n",ans);
    while(!q.empty()) q.pop();num=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i].num==x||(x==-1&&num==k-1))
        {
            while(!q.empty()) printf("%d ",q.top().x),q.pop();
            printf("%d",a[i].num);
            return 0;
        }
        num++;q.push(node(a[i].num,a[i].r)); 
        if(num==k) num--,q.pop();
    }
}
查看评论

【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
  • 39

BZOJ 5102: [POI2018]Prawnicy

Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0。 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大。 Input 第一行包含两个正整数n,k(...
  • ypxrain
  • ypxrain
  • 2018-04-16 10:19:52
  • 2

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
  • 19

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
  • 435

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
  • 249

bzoj 5099: [POI2018]Pionek

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

[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
  • 178

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
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 4013
    排名: 9585
    最新评论