问题描述

在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。

对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左端点的值。

输入格式

第一行包含两个正整数 n,m用空格隔开,意义如上文所述。保证 1≤m≤n

接下来 n行,每行表示一个区间,包含用空格隔开的两个整数 li 和 ri 为该区间的左右端点。

N<=500000,M<=200000,0≤li≤ri≤10^9

输出格式

只有一行,包含一个正整数,即最小花费。

样例输入

6 3

3 5

1 2

3 4

2 2

1 5

1 4

样例输出

2

说明

解析

我们尽可能地要取费用小的区间,所以就把所有的区间按长度从小到大排序。利用尺取法的思想,逐个加入区间。若某个时刻某个点被覆盖的次数大于m,统计答案,然后就从前面开始去掉区间直到覆盖次数小于等于m。 具体维护可以用线段树维护覆盖次数的最大值来做。当然l和r是要离散化的。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 500002
using namespace std;
struct seg{
int len,l,r;
}a[N];
struct SegmentTree{
int dat,add;
}t[N*8];
int n,m,i,j,tmp[N*2];
int read()
{
char c=getchar();
int w=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0'){
w=w*10+c-'0';
c=getchar();
}
return w;
}
int my_comp(const seg &x,const seg &y)
{
return x.len<y.len;
}
void spread(int p)
{
if(t[p].add){
t[p*2].dat+=t[p].add;
t[p*2+1].dat+=t[p].add;
t[p*2].add+=t[p].add;
t[p*2+1].add+=t[p].add;
t[p].add=0;
}
}
void change(int p,int l,int r,int ql,int qr,int x)
{
if(ql<=l&&r<=qr){
t[p].dat+=x;
t[p].add+=x;
return;
}
int mid=(l+r)/2;
spread(p);
if(ql<=mid) change(p*2,l,mid,ql,qr,x);
if(qr>mid) change(p*2+1,mid+1,r,ql,qr,x);
t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
int main()
{
n=read();m=read();
for(i=1;i<=n;i++){
a[i].l=read(),a[i].r=read();
tmp[i*2-1]=a[i].l;
tmp[i*2]=a[i].r;
}
sort(tmp+1,tmp+2*n+1);
int n1=unique(tmp+1,tmp+2*n+1)-tmp-1;
for(i=1;i<=n;i++){
a[i].len=a[i].r-a[i].l;
a[i].l=lower_bound(tmp+1,tmp+n1+1,a[i].l)-tmp;
a[i].r=lower_bound(tmp+1,tmp+n1+1,a[i].r)-tmp;
}
sort(a+1,a+n+1,my_comp);
i=j=0;
int ans=1<<30;
while(i<n){
while(i<n&&t[1].dat<m){
i++;
change(1,1,n1,a[i].l,a[i].r,1);
}
if(t[1].dat<m) break;
while(j<n&&t[1].dat>=m){
j++;
change(1,1,n1,a[j].l,a[j].r,-1);
}
ans=min(ans,a[i].len-a[j].len);
}
if(ans==1<<30) printf("-1\n");
else printf("%d\n",ans);
return 0;
}

[洛谷P1712] NOI2016 区间的更多相关文章

  1. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  2. 洛谷 P1712 [NOI2016]区间(线段树)

    传送门 考虑将所有的区间按长度排序 考虑怎么判断点被多少区间覆盖,这个可以离散化之后用一棵权值线段树来搞 然后维护两个指针$l,r$,当被覆盖次数最多的点的覆盖次数小于$m$时不断右移$r$,在覆盖次 ...

  3. 洛谷$P1712\ [NOI2016]$区间 线段树

    正解:线段树 解题报告: 传送门$QwQ$ $umm$很久以前做的了来补个题解$QwQ$ 考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权 ...

  4. 洛谷 1063 dp 区间dp

    洛谷 1063 dp 区间dp 感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态.. 初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, ...

  5. Luogu P1712 [NOI2016]区间(线段树)

    P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...

  6. BZOJ5259/洛谷P4747: [Cerc2017]区间

    BZOJ5259/洛谷P4747: [Cerc2017]区间 2019.8.5 [HZOI]NOIP模拟测试13 C.优美序列 思维好题,然而当成NOIP模拟题↑真的好吗... 洛谷和BZOJ都有,就 ...

  7. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  8. [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

    额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...

  9. 洛谷 P1890 gcd区间

    P1890 gcd区间 题目提供者 洛谷OnlineJudge 标签 数论(数学相关) 难度 普及/提高- 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R] ...

随机推荐

  1. 【C/C++】什么是线程安全

    <strong>线程安全</strong>就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不 ...

  2. 【VS开发】【Linux开发】【DSP开发】如何截获以太网帧并解析

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. 【DSP开发】C6000非多核非KeyStone系列DSP中断系统

    C6000系列DSP的中断系统 上一篇介绍了C6455的GPIO系统,最后把GPIO4配置成了中断/事件模式,本文将介绍C6455的中断系统,介绍完基本概念后,给出把GPIO4映射到INT4的代码. ...

  4. python多线程学习(一)

    python多线程.多进程 初探 原先刚学Java的时候,多线程也学了几天,后来一直没用到.然后接触python的多线程的时候,貌似看到一句"python多线程很鸡肋",于是乎直接 ...

  5. 【C++】A trick I learned:put boilerplate code into constructor of a struct

    I learned this trick from hitonanode's submission on AtCoder. The trick is like struct fast_ios { fa ...

  6. 使用Python基于OpenCV的图像油画特效

    算法步骤: 1.获取图像的灰度图片 2.设计一个小方框(4x4/8x8 /10x10等),统计每个小方框的像素值 3.将0-255的灰度值划分成几个等级,并把第二步处理的结果映射到所设置的各个等级中, ...

  7. php 技术点积累

    PHP 反射之动态代理 php跨域的几种方式 给 PHP 开启 shmop 扩展实现共享内存 php十进制转二进制不用函数 php+nodeJs+thrift协议,实现zookeeper节点数据自动发 ...

  8. python:split()函数

    描述 Python 内置函数 指定分隔符对字符串进行切片 如果参数 num 有指定值,则仅分隔 num 个子字符串 返回分割后的字符串列表. 语法 str.split(str="" ...

  9. git 基本命令操作

    配置 Git 的相关参数. Git 一共有3个配置文件: 1. 仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效.2. 全局配置文件:Mac 系统在 ~/.gi ...

  10. 关于rpm包的安装卸载等

    在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM) ...