[Noi2016]区间[离散化+线段树维护+决策单调性]
4653: [Noi2016]区间
Time Limit: 60 Sec Memory Limit: 256 MB
Submit: 621 Solved: 329
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
3 5
1 2
3 4
2 2
1 5
1 4
Sample Output
HINT
Source
首先我们考虑暴力怎么做,按长度排序之后,我们容易发现,如果枚举一个区间作为左端点,一个区间作为右端点,那么我们就是求只在这个区间中选取的答案。
我们把这一段的所有区间的对应的一段的经过次数都加一,最后只需check一下这一段中是否出现了一个被经过m次的点,一旦存在就说明,我们一定可以找到其中的mm个区间满足题目的要求,所以我们就可以确保在这个区间中能够选取m个区间并一定合法,就可以用右端点的那个区间长度-左端点的那个区间长度来更新答案。(并不关心具体选了哪些区间)
上述做法的复杂度可以用线段树维护来做到n2logn。深入思考可以发现,其实右端点肯定是不降的,所以我们没必要再枚举一个右端点,只要用单调指针一直往后扫即可。总复杂度为:O(nlogn)。
(引自 ljh2000)
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lch k<<1
#define rch k<<1|1
using namespace std;
const int N=1e6+,M=N<<;
const int inf=2e9;
int n,m,p,cnt,ans=inf;
int mx[M],tag[M];
struct node{int l,r,len;}a[N>>];int b[N];
inline bool cmp(const node &x,const node &y){
return x.len<y.len;
}
inline void opera(int k,int v){
mx[k]+=v;
}
inline void pushdown(int k,int l,int r){
if(!tag[k]) return ;
tag[lch]+=tag[k];opera(lch,tag[k]);
tag[rch]+=tag[k];opera(rch,tag[k]);
tag[k]=;
}
void change(int k,int l,int r,int x,int y,int v){
if(l==x&&r==y){
opera(k,v);
tag[k]+=v;
return ;
}
pushdown(k,l,r);
int mid=(l+r)>>;
if(y<=mid) change(lch,l,mid,x,y,v);
else if(x>mid) change(rch,mid+,r,x,y,v);
else change(lch,l,mid,x,mid,v),change(rch,mid+,r,mid+,y,v);
mx[k]=max(mx[lch],mx[rch]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r),a[i].len=a[i].r-a[i].l;;
for(int i=;i<=n;i++) b[++cnt]=a[i].l,b[++cnt]=a[i].r;
sort(a+,a+n+,cmp);
sort(b+,b+cnt+);cnt=unique(b+,b+cnt+)-(b+);
for(int i=;i<=n;i++){
a[i].l=lower_bound(b+,b+cnt+,a[i].l)-b,
a[i].r=lower_bound(b+,b+cnt+,a[i].r)-b;
}
int top=;
for(int i=;i<=n;i++){
for(;mx[]<m&&top<=n;top++){
change(,,cnt,a[top].l,a[top].r,);
}
if(mx[]==m) ans=min(ans,a[top-].len-a[i].len);
change(,,cnt,a[i].l,a[i].r,-);
}
printf("%d\n",ans!=inf?ans:-);
return ;
}
[Noi2016]区间[离散化+线段树维护+决策单调性]的更多相关文章
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- BZOJ4653(区间离散化+线段树+决策单调尺取)
写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按 ...
- [Codeforces]817F. MEX Queries 离散化+线段树维护
[Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...
- BZOJ4653 [NOI2016] 区间 【线段树】
题目分析: 首先思考一个二分答案的做法.我们可以注意到答案具有单调性,所以可以二分答案. 假设当前二分的答案是$ k $.那么按照大小顺序插入每个区间,同时在末端删除会对答案产生影响的区间.这里不妨用 ...
- 2018.08.17 bzoj4653: [Noi2016]区间(线段树+尺取法)
传送门 将坐标离散化之后直接用尺取法(双指针)+线段树维护. 其实就是说只要目前所有点的被覆盖次数是大于等于m的就移动左指针删除区间更新答案,否则移动右指针加入区间更新答案. 话说忘记排序以及建树的时 ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- 2019牛客多校第七场E Find the median 离散化+线段树维护区间段
Find the median 题意 刚开始集合为空,有n次操作,每次操作往集合里面插入[L[i],R[i]]的值,问每次操作后中位数是多少 分析 由于n比较大,并且数可以达到1e9,我们无法通过权值 ...
- [BZOJ4653][NOI2016]区间 贪心+线段树
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...
随机推荐
- windows下winscp连接ubuntu
在ubuntu下安装ssh: sudo apt-get install openssh-server 即可解决.
- unity3d 读取usb摄像头
using UnityEngine; using System.Collections; public class C : MonoBehaviour { private WebCamTexture ...
- 通过tarball形式安装HBASE Cluster(CDH5.0.2)——HBASE 真分布式集群配置
一.应该先配置好zookeeper并成功启动,否则hbase无法启动 二.配置HBASE集群 1,配置hbase-env.sh,下面是最少配置项目 [hadoop@zk1 conf]$ vim hba ...
- Java编程思想学习笔记——枚举类型
前言 关键字enum可以将一组具名的值有限集合创建一种为新的类型,而这些具名的值可以作为常规的程序组件使用. 正文 基本enum特性 调用enum的values()方法可以遍历enum实例,value ...
- Oracle创建directory
Oracle创建directory 一般创建directory都是为了用数据泵导入/导出数据用,其实directory还有很多别的用处,本文不做阐述 1.新建directory的语法 CREA ...
- js循环异常
1.当在循环数组时,数组发生变化,循环item 为定义undifined $.each(blogMng.commonKit.upLoadMng.medias, function (index, ite ...
- Aspose------导入Excel
代码: public List<T> ImportExcelToList<T>() { HttpContext context = HttpContext.Current; ) ...
- Linux下修改当前用户的最大线程数和 open files
1 查看当前用户的线程 ulimit -a 2 修改配置文件 vi /etc/security/limits.d/90-nproc.conf 3 改完即可生效 4 修改可打开的最大文件数 vi /e ...
- Apache双机热备
部署方案 1.1 方案设计 1.2 方案描述 如上图所示,我们要有三个可用的IP地址(切记不能与网络中其他机器IP重复),针对我使用的三个IP地址做如下说明: 10.16.252.10 //这个IP地 ...
- Java -- 异常的捕获及处理 -- throws与throw关键字
7.2 throws 与 throw关键字 7.2.1 throws 关键字 在定义一个方法时可以使用throws关键字声明,使用throws声明的方法标识此方法不处理异常,而交给方法的调用处进行处理 ...