题目链接

题目大意:给定$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】区间 题解(线段树+尺取法)的更多相关文章

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

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

  2. P1712-[NOI2016]区间【线段树,尺取法】

    正题 题目链接:https://www.luogu.com.cn/problem/P1712 题目大意 \(n\)个区间,求出其中\(m\)个区间使得它们有覆盖同一个点且最长区间长度减去最短长度最小. ...

  3. 【洛谷 P1712】 [NOI2016]区间 (线段树+尺取)

    题目链接 emmm看起来好像无从下手, \(l_i,r_i\)这么大,肯定是要离散化的. 然后我们是选\(m\)个区间,我们先对这些区间按长度排个序也不影响. 排序后,设我们取的\(m\)个区间的编号 ...

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

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

  5. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  6. luogu 1712 区间(线段树+尺取法)

    题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费.花费指的是选择的区间中最大长度减去最小长度. 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭 ...

  7. [BZOJ4653][NOI2016]区间 贪心+线段树

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...

  8. [Noi2016]区间[离散化+线段树维护+决策单调性]

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 621  Solved: 329[Submit][Status][D ...

  9. NOI2016 区间 【线段树】

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

随机推荐

  1. Tensorflow-gpu环境搭建

    显卡设备:英伟达1060 系统:Windows10 python版本:3.7.4 CUDA:cuda_10.0.130_411.31_win10 cudnn:cudnn-10.0-windows10- ...

  2. JavaScript的参数是按照什么方式传递的?

    1.基本类型传递方式 <script> var a = 1; function test(x) { x = 10; console.log(x); } test(a); // consol ...

  3. C++左值引用与右值引用

    本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/references-cpp?view=vs-2019 引用,类似于指针,用于存储一个位于内存某处的对象的 ...

  4. 【Linux】Linux常用命令及操作 (一)

    一.Linux简介 二.Linux基础命令 三.工作常用命令 --------------------------------------------------------------------- ...

  5. Maven 专题(一):Maven 安装与配置(vscode)

    0.首先了解一下maven安装目录 Bin:该目录包含Mvn运行的脚本 Boot:Maven自身的类加载器框架 Conf:包含非常重要的文件setting.xml Lib:该目录包含了所有Maven运 ...

  6. softmax、cross entropy和softmax loss学习笔记

    之前做手写数字识别时,接触到softmax网络,知道其是全连接层,但没有搞清楚它的实现方式,今天学习Alexnet网络,又接触到了softmax,果断仔细研究研究,有了softmax,损失函数自然不可 ...

  7. 细说php锁

    bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件指针.o ...

  8. python实现图片文字提取,准确率高达99%,强无敌!!!

    上次我使用的百度AI开放平台的API接口实现图片的转化,后来有许多小伙伴都私信问我,怎么获取百度AI平台的AK和SK.为了统一回答大家的问题,今天我又使用百度API实现了一个从图片中提取文字和识别身份 ...

  9. 从对象到类,Java中需要知道的这些东西

    1. 对象的诞生   在平时的开发中,我们使用对象的时候,都是直接new一个临时变量然后进行各种逻辑赋值然后返回,但是你有没有想过一个对象在创建的过程中经历了什么呢,为什么创建时静态变量就已经赋完值了 ...

  10. 理解js中的几种设计模式

    目录 工厂模式 构造函数模式 原型模式 组合使用构造函数模式和原型模式 动态原型模式 其它模式 工厂模式 function createPerson(name, age){ var o = new O ...