Description

在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。
对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左端点的值。
求所有合法方案中最小的花费。如果不存在合法的方案,输出 −1。

Input

第一行包含两个正整数 n,m用空格隔开,意义如上文所述。保证 1≤m≤n
接下来 n行,每行表示一个区间,包含用空格隔开的两个整数 li 和 ri 为该区间的左右端点。
N<=500000,M<=200000,0≤li≤ri≤10^9

Output

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

Sample Input

6 3
3 5
1 2
3 4
2 2
1 5
1 4

Sample Output

2
 
双指针扫一下即可,难得的noi水题
代码:
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 1000010
#define int long long
#define ls node<<1
#define rs node<<1|1
using namespace std;
int read()
{
char ch=getchar();int x=;
while(ch>''||ch<'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x;
} int l,r,n,m,tmp,ans=1e18;
int b[M<<],cnt[M<<],tag[M<<];
struct point{int l,r;}a[M];
bool cmp(point a1,point a2) {return a1.r-a1.l<a2.r-a2.l;} void getans(int l,int r)
{
ans=min(ans,b[a[r].r]-b[a[r].l]+b[a[l].l]-b[a[l].r]);
} int get(int x)
{
int l=,r=tmp;
while(l<=r)
{
int mid=(l+r)/;
if(b[mid]==x) return mid;
if(b[mid]<x) l=mid+;
else r=mid-;
}
} void push(int node)
{
if(tag[node]!=)
{
tag[ls]+=tag[node];
tag[rs]+=tag[node];
cnt[ls]+=tag[node];
cnt[rs]+=tag[node];
tag[node]=;
}
} void change(int node,int l,int r,int l1,int r1,int v)
{
if(l1<=l&&r1>=r)
{
cnt[node]+=v;
tag[node]+=v;
return;
}
if(l1>r||r1<l) return;
int mid=(l+r)/; push(node);
change(ls,l,mid,l1,r1,v);
change(rs,mid+,r,l1,r1,v);
cnt[node]=max(cnt[ls],cnt[rs]);
} main()
{
n=read(); m=read();
for(int i=;i<=n;i++)
{
a[i].l=read(),a[i].r=read();
b[++tmp]=a[i].l,b[++tmp]=a[i].r;
}
sort(a+,a++n,cmp);
sort(b+,b++tmp);
tmp=unique(b+,b++tmp)-b-;
for(int i=;i<=n;i++)
{
a[i].l=get(a[i].l);
a[i].r=get(a[i].r);
}
while()
{
while(cnt[]>=m)
{
getans(l,r);
change(,,tmp,a[l].l,a[l].r,-);
l++;
}
if(r==n) break;
r++;
change(,,tmp,a[r].l,a[r].r,);
}
if(ans==1e18) puts("-1");
else printf("%lld",ans);
return ;
}

[BZOJ4653 区间]的更多相关文章

  1. 【BZOJ4653】【NOI2016】区间(线段树)

    [BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...

  2. 【BZOJ4653】【NOI2016】区间 线段树

    题目大意 数轴上有\(n\)个闭区间\([l_1,r_1],[l_2,r_2],\ldots,[l_n,r_n]\),你要选出\(m\)个区间,使得存在一个\(x\),对于每个选出的区间\([l_i, ...

  3. 【BZOJ4653】[Noi2016]区间 双指针法+线段树

    [BZOJ4653][Noi2016]区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含 ...

  4. 【BZOJ-4653】区间 线段树 + 排序 + 离散化

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 107  Solved: 70[Submit][Status][Di ...

  5. BZOJ4653: [Noi2016]区间

    传送门 UOJ上卡掉一个点,COGS上卡掉两个点..弃疗,不改了,反正BZOJ上过啦hhh 先把区间按长度递增排序.然后每次用线段树维护区间最大覆盖次数,用一个指针随便扫扫就行了. //NOI 201 ...

  6. 【BZOJ4653】【Noi2016D2】区间

    原题传送门 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得 ...

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

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

  8. BZOJ4653 [NOI2016] 区间 【线段树】

    题目分析: 首先思考一个二分答案的做法.我们可以注意到答案具有单调性,所以可以二分答案. 假设当前二分的答案是$ k $.那么按照大小顺序插入每个区间,同时在末端删除会对答案产生影响的区间.这里不妨用 ...

  9. 2018.08.17 bzoj4653: [Noi2016]区间(线段树+尺取法)

    传送门 将坐标离散化之后直接用尺取法(双指针)+线段树维护. 其实就是说只要目前所有点的被覆盖次数是大于等于m的就移动左指针删除区间更新答案,否则移动右指针加入区间更新答案. 话说忘记排序以及建树的时 ...

随机推荐

  1. linux devcie lspci,lscpu,blkdiscard,fstrim,parted,partprobe,smartctl

    blkdiscard/sparse/thin-provisioned device,like ssdfstrim--- discard unused blocks on a mounted files ...

  2. nodejs(一)

    nodejs第一章节 使用node来实现第一个http服务器 var http = require(‘http’); http.createServer(function (request, resp ...

  3. python3在centos6.6上的安装

    建议:在看这个文档操作前,最好先参考一下这个:https://www.cnblogs.com/bookwed/p/10251236.html,是解决pip安装模块时,提示ssl版本低的问题. #提前的 ...

  4. 需求-shidebing

    # 原始数据 list1 = [ {"c_id": "101", "e_code": "201"}, {"c_ ...

  5. java7(1)——反编译深入理解增强的switch(读字节命令实战)

    [本文介绍] 本文主要讲java_7 的改进switch的底层实现.反编译一个使用带String的switch的demo并一步步解析反编译出来的字节命令,从编译的角度解读switch的底层实现. [正 ...

  6. docker-compose部署zk集群、kafka集群以及kafka-manager,及其遇到的问题和解决

    zk集群docker-compose.yml 1.新建网络 docker network create --driver bridge --subnet --gateway 172.23.0.1 zo ...

  7. Powerdesigner显示列名

    设置要修改的列 点击ok即可.

  8. G729 详细使用文档

    https://tools.ietf.org/html/rfc4749 git://git.linphone.org/linphone-android.git http://stackoverflow ...

  9. Linux SSH免登录配置总结(转)

    转载请出自出处:http://eksliang.iteye.com/blog/2187265 一.原理 我们使用ssh-keygen在ServerA上生成私钥跟公钥,将生成的公钥拷贝到远程机器Serv ...

  10. 我与前端之间不得说的三天两夜之css基础

    前端基础之CSS CSS 语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. ''' selector { property: value; property: value; ... ...