【NOI2016】区间 题解(线段树+尺取法)
题目大意:给定$n$个区间$[l_i,r_i]$,选出$m$个区间使它们有一个共同的位置$x$,且使它们产生的费用最小。求最小费用。费用定义为最长的区间长度减去最短区间长度。
-----------------
因为区间顺序改动又不影响答案,我们不妨按照长度排个序。看到数据范围果断离散化。
思考一种最朴素的做法:将排好序的区间逐一加入数轴,看有没有一个点被覆盖的次数$\geq m$。
有的话就统计一下答案,然后将前面加入的数删掉,直到$<m$。
显然用到了尺取法。维护是否有一个点被覆盖的次数可以用线段树。
然后就可以成功A掉此题。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,maxx,b[],cnt,size,head=,tail=,ans=0x3f3f3f3f;
struct node
{
int l,r,len;
}a[];
struct tree
{
int index,l,r,max,lazy;
}tree[];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool cmp(node x,node y)
{
return x.len<y.len;
}
inline void build(int index,int l,int r)
{
tree[index].l=l;
tree[index].r=r;
if (l==r) return;
int mid=(l+r)>>;
build(index*,l,mid);
build(index*+,mid+,r);
}
inline void pushdown(int index)
{
tree[index*].lazy+=tree[index].lazy;
tree[index*+].lazy+=tree[index].lazy;
tree[index*+].max+=tree[index].lazy;
tree[index*].max+=tree[index].lazy;
tree[index].lazy=;
}
inline void update(int index,int l,int r,int x)
{
if (l<=tree[index].l&&tree[index].r<=r)
{
tree[index].max+=x;
tree[index].lazy+=x;
return;
}
if (tree[index].lazy) pushdown(index);
int mid=(tree[index].l+tree[index].r)>>;
if (l<=mid) update(index*,l,r,x);
if (r>mid) update(index*+,l,r,x);
tree[index].max=max(tree[index*+].max,tree[index*].max);
}
int main()
{
n=read(),m=read();
for (int i=;i<=n;i++)
{
a[i].l=read(),a[i].r=read();a[i].len=a[i].r-a[i].l;
b[++cnt]=a[i].l;b[++cnt]=a[i].r;
}
sort(b+,b+cnt+);
size=unique(b+,b+cnt+)-b-;
sort(a+,a+n+,cmp);
for (int i=;i<=n;i++)
{
a[i].l=lower_bound(b+,b+size+,a[i].l)-b;
a[i].r=lower_bound(b+,b+size+,a[i].r)-b;
maxx=max(maxx,a[i].r);
}
build(,,maxx);
while(tail<n)
{
while(tree[].max<m&&tail<=n){tail++;update(,a[tail].l,a[tail].r,);}
if (tree[].max<m) break;
while(head<=tail&&tree[].max>=m)
{
head++;update(,a[head].l,a[head].r,-);
ans=min(ans,a[tail].len-a[head].len);
}
}
if (ans==0x3f3f3f3f) printf("-1");
else printf("%d",ans);
return ;
}
【NOI2016】区间 题解(线段树+尺取法)的更多相关文章
- 2018.08.17 bzoj4653: [Noi2016]区间(线段树+尺取法)
传送门 将坐标离散化之后直接用尺取法(双指针)+线段树维护. 其实就是说只要目前所有点的被覆盖次数是大于等于m的就移动左指针删除区间更新答案,否则移动右指针加入区间更新答案. 话说忘记排序以及建树的时 ...
- P1712-[NOI2016]区间【线段树,尺取法】
正题 题目链接:https://www.luogu.com.cn/problem/P1712 题目大意 \(n\)个区间,求出其中\(m\)个区间使得它们有覆盖同一个点且最长区间长度减去最短长度最小. ...
- 【洛谷 P1712】 [NOI2016]区间 (线段树+尺取)
题目链接 emmm看起来好像无从下手, \(l_i,r_i\)这么大,肯定是要离散化的. 然后我们是选\(m\)个区间,我们先对这些区间按长度排个序也不影响. 排序后,设我们取的\(m\)个区间的编号 ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- luogu 1712 区间(线段树+尺取法)
题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费.花费指的是选择的区间中最大长度减去最小长度. 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭 ...
- [BZOJ4653][NOI2016]区间 贪心+线段树
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...
- [Noi2016]区间[离散化+线段树维护+决策单调性]
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 621 Solved: 329[Submit][Status][D ...
- NOI2016 区间 【线段树】
题目 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一个被 ...
随机推荐
- [JAVA]标准IO流操作
import java.io.*; /** * @Description: * @projectName:JavaTest * @see:PACKAGE_NAME * @author:郑晓龙 * @c ...
- Java实现上传文件到指定服务器指定目录(ChannelSftp实现文件上传下载)
package com.tianyang.task.utils; import java.io.File;import java.io.FileInputStream;import java.io.I ...
- about 蛤蛤
蛤蛤属于蛤蛤门(haha),蛤蛤纲(haha),蛤蛤亚纲(haha),蛤蛤目(haha),蛤蛤总科(haha),蛤蛤科(haha).
- 【转】Hbuilder配置Avalon、Vue指令提示
转载自CSDN http://blog.csdn.net/jianggujin/article/details/71419828 我本人是一名Java后端开发,偶尔也会研究一下前端内容,因为Hbuil ...
- ## Java基础(二):变量类型
Java 变量类型 一.局部变量:类的方法中的变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方语句块中被执行的时候创建,当他们执行完成后,变量被销毁 访问修饰符不能用于局部变量 ...
- 【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!
写在前面 在<[高并发]面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!>一文中,我们主要介绍了如何使用Nginx进行限流,以避免系统被大流量压垮.除此之外,Ngin ...
- CRM【第二篇】: stark组件
介绍: stark组件,是一个帮助开发者快速实现数据库表的增删改查+的组件.目标: 10s 中完成一张表的增删改查. 前戏: django项目启动时,自定义执行某个py文件. django启动时,且在 ...
- bzoj3223Tyvj 1729 文艺平衡树
bzoj3223Tyvj 1729 文艺平衡树 题意: 一个数列,支持区间翻转操作. 题解: splay裸题.注意涉及到区间操作的一般用splay不用treap. 代码: #include <c ...
- 金三银四,资深HR给面试者的十大建议
一.提前复习好你的专业知识 专业知识是最为重要的一点,拥有了坚实的专业基础,你才能迈向成功的彼岸. 因此,面试之前,一定一定要复习好专业知识.对自己学过的知识,要做一个概括,放在脑海中.茶余饭后,复习 ...
- CISSP 考试经验分享
复习资料: <Eleventh Hour CISSP> <汇哲培训讲义> <CISSP Official Security Professional>Eighth ...