【BZOJ4653】【NOI2016】区间(线段树)
【BZOJ4653】【NOI2016】区间(线段树)
题面
题解
\(NOI\)良心送分题??
既然是最大长度减去最小长度
莫名想到那道反复减边求最小生成树
从而求出最小的比值
所以这题的套路是一样的
按照长度排序之后
依次加入
如果当前有被覆盖了超过\(m\)次的点
就从前面开始,依次把线段拿走
每次更新一下答案就好啦
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define INF 2e9
#define MAX 520000
#define lson (now<<1)
#define rson (now<<1|1)
#define rg register
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Seg{int l,r,v;}p[MAX];
bool operator<(Seg a,Seg b){return a.v<b.v;}
struct Node
{
int v,ly;
}t[MAX<<5];
int al,ar;
void Modify(int now,int l,int r,int w)
{
if(al<=l&&r<=ar){t[now].v+=w;t[now].ly+=w;return;}
int mid=(l+r)>>1;
if(al<=mid)Modify(lson,l,mid,w);
if(ar>mid)Modify(rson,mid+1,r,w);
t[now].v=max(t[lson].v,t[rson].v)+t[now].ly;
}
inline int Query(){return t[1].v+t[1].ly;}
int n,m,S[MAX<<1],tot;
int main()
{
n=read();m=read();
for(rg int i=1;i<=n;++i)
{
S[++tot]=p[i].l=read();
S[++tot]=p[i].r=read();
p[i].v=p[i].r-p[i].l;
}
sort(&S[1],&S[tot+1]);
tot=unique(&S[1],&S[tot+1])-S-1;
for(rg int i=1;i<=n;++i)
{
p[i].l=lower_bound(&S[1],&S[tot+1],p[i].l)-S;
p[i].r=lower_bound(&S[1],&S[tot+1],p[i].r)-S;
}
sort(&p[1],&p[n+1]);
rg int pos=1,ans=INF;
for(rg int i=1;i<=n;++i)
{
al=p[i].l;ar=p[i].r;
Modify(1,1,tot,1);
if(Query()==m)
{
while(Query()==m)
{
al=p[pos].l;ar=p[pos].r;
ans=min(ans,p[i].v-p[pos].v);
Modify(1,1,tot,-1);
pos++;
}
}
}
printf("%d\n",ans==INF?-1:ans);
return 0;
}
【BZOJ4653】【NOI2016】区间(线段树)的更多相关文章
- BZOJ4653 [NOI2016]区间 [线段树,离散化]
题目传送门 区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就 ...
- BZOJ4653: [Noi2016]区间(线段树 双指针)
题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...
- BZOJ4653:[NOI2016]区间(线段树)
Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x ...
- 【BZOJ-4653】区间 线段树 + 排序 + 离散化
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 107 Solved: 70[Submit][Status][Di ...
- BZOJ.4653.[NOI2016]区间(线段树)
BZOJ4653 UOJ222 考虑二分.那么我们可以按区间长度从小到大枚举每个区间,对每个区间可以得到一个可用区间长度范围. 我们要求是否存在一个点被这些区间覆盖至少\(m\)次.这可以用线段树区间 ...
- [NOI2016]区间 线段树
[NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...
- Luogu P1712 [NOI2016]区间(线段树)
P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...
- UOJ222 NOI2016 区间 线段树+FIFO队列
首先将区间按长度排序后离散化端点(这里的“长度”指的是离散化之前区间的实际长度) 然后模拟一个队列,区间按排好的顺序依次进入,直到某个点被覆盖了M次.之后依次出队,直到所有点都被覆盖小于M次 修改和询 ...
- 洛谷$P1712\ [NOI2016]$区间 线段树
正解:线段树 解题报告: 传送门$QwQ$ $umm$很久以前做的了来补个题解$QwQ$ 考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权 ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
随机推荐
- Vi/Vim的快捷方式
1 vi/ vim键盘图 2 文字解说 进入编辑模式的6种方式: i在光标前插入 I在行首插入 a在光标后插入 A在行末插入 o在下一行插入 O在上一行插入 删除字符 x 删除当前字符 X 删除前一个 ...
- CentOS下安装go语言编译环境
1.下载Go语言的安装包 这里给大家一个百度的分享连接http://pan.baidu.com/s/1qY3xPaG下载到CentOS的系统之中 $ tar -xzf go1.5.2.linux-xx ...
- python学习:收集ip信息
#!/usr/bin/env python from subprocess import Popen, PIPE def getIfconfig(): p = Popen(['ifco ...
- How to delete a VM with snapshots
A note about error: "cannot delete inactive domain with snapshots" You cannot delete a VM ...
- Linux 获取本机IP、MAC地址用法大全
getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...
- Java基础系列--final关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记17
day17课程内容: 装饰器回顾练习 登录功能: #登录京东,不同的页面,选择页面,然后不同的登录方式with open('作业5.1jingdong','w',encoding='utf8') as ...
- POJ - 3414 bfs [kuangbin带你飞]专题一
状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可. d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量. AC代码 #include<cst ...
- 编写React组件的最佳实践
此文翻译自这里. 当我刚开始写React的时候,我看过很多写组件的方法.一百篇教程就有一百种写法.虽然React本身已经成熟了,但是如何使用它似乎还没有一个"正确"的方法.所以我( ...
- Supervisor使用说明
Supervisor是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程.它可以同时启动,关闭多个进程,使用起来特别的方便. 1.组成部分 s ...