UOJ222 NOI2016 区间 线段树+FIFO队列
首先将区间按长度排序后离散化端点(这里的“长度”指的是离散化之前区间的实际长度)
然后模拟一个队列,区间按排好的顺序依次进入,直到某个点被覆盖了M次。之后依次出队,直到所有点都被覆盖小于M次
修改和询问覆盖次数可以用线段树实现
//C++11 code
#include <cstdio>
#include <cstring>
#include <algorithm>
;
const int inf=0x7f7f7f7f;
struct Range
{
int left,right;
int len;
void assign(int l,int r) { left=l; right=r; len=r-l; }
};
struct SegTree
{
struct Node
{
; //max-val
;
int total() { return val+tag; }
};
Node node[maxN<<];
int size;
int _val;
void update(int cur,int right)
{
node[cur].val = std::max(node[cur+].total(),node[right].total());
}
void add(int L,int R,int val)
{
_val=val;
__add(,L,R+,,size);
}
void __add(int cur,int rL,int rR,int nL,int nR)
{
if(rL<=nL && rR>=nR)
{
node[cur].tag+=_val;
return;
}
;
);
,rL,rR,nL,mid);
if(rR>mid) __add(right,rL,rR,mid,nR);
update(cur,right);
}
].total(); }
};
Range rg[maxN];
SegTree segt;
int N,M;
];
int valNum;
void input()
{
scanf("%d%d",&N,&M);
int tl,tr;
;i<N;i++)
{
scanf("%d%d",&tl,&tr);
buf[i<<]=tl;
buf[(i<<)+]=tr;
rg[i].assign(tl,tr);
}
}
void discretize()
{
std::sort(buf,buf+(N<<));
valNum=std::unique(buf,buf+(N<<))-buf;
;i<N;i++)
{
rg[i].left=std::lower_bound(buf,buf+valNum,rg[i].left)-buf;
rg[i].right=std::lower_bound(buf,buf+valNum,rg[i].right)-buf;
}
}
int solve()
{
int res=inf;
auto cmpIdx=[](const Range& A,const Range& B)->bool { return A.len<B.len; };
std::sort(rg,rg+N,cmpIdx);
discretize();
segt.size=valNum;
,tail=-;
)
{
while((++head)<N && segt.askAll()<M)
segt.add(rg[head].left,rg[head].right,);
if(segt.askAll()<M) break;
else --head;
while(segt.askAll()==M)
{
++tail;
res=std::min(res,rg[head].len-rg[tail].len);
segt.add(rg[tail].left,rg[tail].right,-);
}
}
:res;
}
int main()
{
input();
printf("%d\n",solve());
;
}
UOJ222 NOI2016 区间 线段树+FIFO队列的更多相关文章
- 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\) 个区间, ...
- BZOJ4653 [NOI2016]区间 [线段树,离散化]
题目传送门 区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就 ...
- BZOJ4653: [Noi2016]区间(线段树 双指针)
题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...
- 洛谷$P1712\ [NOI2016]$区间 线段树
正解:线段树 解题报告: 传送门$QwQ$ $umm$很久以前做的了来补个题解$QwQ$ 考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权 ...
- BZOJ4653:[NOI2016]区间(线段树)
Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
随机推荐
- Win8/Win7系统下用IE11浏览器调试js脚本
作为一个web开发者,调试js脚本是工作中的一部分,但是并不是所有的浏览器都会很好的兼容js脚本的.随着win8系统的发布,ie11也慢慢进入了大家的视野,ie11的众多优点及新特性就不必多说了(全面 ...
- 使用Struts2开发Java Web应用程序(目录)
连接地址 http://blog.csdn.net/struts2/article/details/1721752
- iOS屏蔽高频点击技巧
例如高频率点击一个按钮或者TableViewCell,会造成功能多次重复执行,在异步网络请求时候或者多线程时候,造成的问题尤其明显. 解决方法: 声明一个属性self.actionWorking ,标 ...
- JavaScript 设计风格&模式 概览 20140418
基本的概念 在JavaScript中,一旦定义好一个变量,该变量会自动成为内置对象的一个属性,(如果该变量是全局变量,那么会成为全局对象的一个属性). 定义的变量实际上也是一个伪类,拥有自身的属性,该 ...
- Spark RDD概念学习系列之rdd的依赖关系彻底解密(十九)
本期内容: 1.RDD依赖关系的本质内幕 2.依赖关系下的数据流视图 3.经典的RDD依赖关系解析 4.RDD依赖关系源码内幕 1.RDD依赖关系的本质内幕 由于RDD是粗粒度的操作数据集,每个Tra ...
- hud 1241 dfs连同块
Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground ...
- 用python正则表达式提取字符串
在日常工作中经常遇见在文本中提取特定位置字符串的需求.python的正则性能好,很适合做这类字符串的提取,这里讲一下提取的技巧,正则表达式的基础知识就不说了,有兴趣的可以看re的教程. 提取一般分两种 ...
- 纪录参加noip2015(pj+tg)复赛
作为一个既参加了pj又参加了tg的初三蒟蒻,本次复赛不得不算一次很happy的事(可以不做周末作业,可以逃掉小班培训) 昨年参加pj的时候,一题眼瞎,二题作死,只有三题蒙了一点分,简直差到一种境界. ...
- 【Android - V】之DrawerLayout的使用
DrawerLayout是Android V4包中的一个布局控件,用来实现一个抽屉样式的布局. DrawerLayout通过设置子视图的layout_gravity来决定子视图停靠在屏幕的哪个边缘外侧 ...
- nanosleep纳秒级延迟
//函数原型 int nanosleep(struct timespec *req, struct timespec *rem) //参数列表: // req:要求的睡眠时间 // rem:剩余的睡眠 ...