BZOJ4653:[NOI2016]区间(线段树)
Description
Input
Output
Sample Input
3 5
1 2
3 4
2 2
1 5
1 4
Sample Output
Solution
Code
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #define N (1000009)
- using namespace std;
- struct Node
- {
- int x,y,len;
- bool operator < (const Node &a) const{return len<a.len;}
- }L[N];
- struct Sgt{int max,add;}Segt[N<<];
- int n,m,b[N],num;
- int getid(int x){return lower_bound(b+,b+num+,x)-b;}
- void Pushdown(int now)
- {
- Segt[now<<].max+=Segt[now].add;
- Segt[now<<|].max+=Segt[now].add;
- Segt[now<<].add+=Segt[now].add;
- Segt[now<<|].add+=Segt[now].add;
- Segt[now].add=;
- }
- void Update(int now,int l,int r,int l1,int r1,int k)
- {
- if (l>r1 || r<l1) return;
- if (l1<=l && r<=r1)
- {
- Segt[now].max+=k;
- Segt[now].add+=k;
- return;
- }
- Pushdown(now);
- int mid=(l+r)>>;
- Update(now<<,l,mid,l1,r1,k);
- Update(now<<|,mid+,r,l1,r1,k);
- Segt[now].max=max(Segt[now<<].max,Segt[now<<|].max);
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for (int i=; i<=n; ++i)
- {
- scanf("%d%d",&L[i].x,&L[i].y); L[i].len=L[i].y-L[i].x;
- b[i*-]=L[i].x; b[i*]=L[i].y;
- }
- sort(b+,b+*n+);
- num=unique(b+,b+*n+)-b-;
- sort(L+,L+n+);
- int pos=,cnt=,ans=2e9;
- for (int i=; i<=n; ++i)
- {
- while (pos<n && Segt[].max<m)
- {
- ++pos; ++cnt;
- int x=getid(L[pos].x), y=getid(L[pos].y);
- Update(,,num,x,y,);
- }
- if (Segt[].max>=m) ans=min(ans,L[pos].len-L[i].len);
- int x=getid(L[i].x), y=getid(L[i].y);
- Update(,,num,x,y,-);
- }
- printf("%d\n",ans==2e9?-:ans);
- }
BZOJ4653:[NOI2016]区间(线段树)的更多相关文章
- BZOJ4653 [NOI2016]区间 [线段树,离散化]
题目传送门 区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就 ...
- BZOJ4653: [Noi2016]区间(线段树 双指针)
题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...
- 【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) ...
随机推荐
- js控制表格隔行变色
只是加载时候隔行变一个颜色,鼠标滑动上去时候没有变化 <table width="800" border="0" cellpadding="0& ...
- C# 配置文件操作类
注意添加引用:System.Configuration: using System; using System.Collections.Generic; using System.Text; usin ...
- 第6天:数据Array
数组Array every() 方法测试数组的所有元素是否都通过了指定函数的测试. array.every callback[, thisArg] callback 被调用时传入三个参数:元素值,元素 ...
- FileSystemWatcher 监视指定目录中的变更
.Net框架类库中的FileSystemWatcher如它的名称一样是一个用于监视文件系统变化的一个控件.使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录 ...
- linux的目录结构及文件基本操作
1. linux的文件组织目录结构 linux的目录与window的区别 win以存储介质为主,主要以盘符及分区实现文件 管理,再下面才是目录. linux以树形目录结构的形式来构造整个系统,每一个目 ...
- OpenStack IceHouse 部署 - 1 - 架构说明
参考架构 Architecture from OpenStack Install Guide Reference Architecture Network Isolation 在本次部署中,我们采用了 ...
- Thymeleaf学习记录(3)--语法
语法: 标准表达式语法 简单表达: 变量表达式: ${...} 选择变量表达式: *{...} 消息表达式: #{...} 链接网址表达式: @{...} 字面 文本文字:'one text','An ...
- 如何在vscode里面调试js和node.js
一般大家调试都是在浏览器端调试js的,不过有些时候也想和后台一样在代码工具里面调试js或者node.js,下面介绍下怎样在vscode里面走断点. 1,用来调试js 一:在左侧扩展中搜索Debugge ...
- CSS(一)sytle
一:CSS语法组成: 选择符 和声明(声明和声明之间用分号隔开) 声明部分:属性和属性值(用冒号链接) 语法:选择符{ 属性1:属性值: 属性2:属性值: } 所有的CSS语句都要放到 ...
- iView定制主题报错问题的解决方法
按照iView官网来是这样的: 1. 在main.js当前目录下新建themes文件夹,里面新建一个叫blue.less的文件 2. 在mian.js里面引入blue.less文件 3. blue.l ...