【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) ...
随机推荐
- 处理springMvc中responsebody返回中文乱码
法一: @RequestMapping(value="/getUsersByPage",produces = public String getUsers 法二:在sprin ...
- redis 设置认证密码
通过修改redis配置文件(redis.conf)修改验证密码.(重启生效) requirepass myRedis 客户端通过密码登录redis并进行操作 redis-cli -h 127.0.0. ...
- 一个网卡配置多个ip配置实现,centos7系统
仅一个网卡情况下,配置多个ip可以让该设备通过几个ip被访问,或隐藏常用ip,让其他人访问临时ip 一.永久性增加一个IP 方法1: vim /etc/sysconfig/network-script ...
- ansible实践3-playbook条件判断
--- - hosts: testhost user: root gather_facts: True tasks: - name: use when shell: t ...
- 【学习笔记】Spring JdbcTemplate (3-3-3)
Spring与JDBC模板(jdbcTemplate) 为了避免直接使用JDBC而带来的复杂冗长的代码 Spring提供的一个强有力的模板类 -- jdbcTemplate简化JDBC操作 并且数据源 ...
- 【学习笔记】Spring中的BeanFactory和ApplicationContext 以及 Bean的生命周期(Y2-3-2)
BeanFactory和ApplicationContext Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类. Spring提供了两种不同的容器: 一种是最基本的Bean ...
- Java经典编程题50道之四十二
809*??=800*??+9*??+1,其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数.求??代表的两位数,以及809*??后的结果. public class Example ...
- bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1003 Solved: 317[Submit][ ...
- yii2 查询构建器
Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...
- linux shell 和linux 命令的区别?windows shell 和 windows 命令呢?
shell翻译成壳的意思,它是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机界面. shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起 ...