BZOJ4653 [NOI2016]区间 [线段树,离散化]
区间
Description
Input
Output
Sample Input
3 5
1 2
3 4
2 2
1 5
1 4
Sample Output
分析:
一开始直接贪心+离散线段树,然后WA得天花乱坠,T飞到了九霄云外。。。还是太naive了。。。
首先,我们能想到这样一个思路:首先对区间按照长度进行排序,这个贪心应该是显然的;然后依次将加入区间,这里加入区间是指将该区间$[l,r]$内的所有权值+1,这样就可以得到,只要有一个点的权值大于或等于$m$,那么就可以更新答案。
维护权值不难想到用权值线段树,但是数据范围太大需要离散化(一开始还在离散卡了好久。。。太菜了。。。)。
更新答案的时候依次将前面添加的区间减掉,直到所有点的权值都小于$m$,然后就可以找到该情况下更新的答案。这是用到尺取法的思想。
Code:
//It is made by HolseLee on 23rd July 2018
//BZOJ 4653
#include<bits/stdc++.h>
using namespace std; const int N=5e5+;
int n,m,ans,l[N],r[N],inf=-; struct Seg{
int id,len;
bool operator < (const Seg x) const {
return len<x.len;
}
}a[N],p[N<<]; inline int Max(int x,int y)
{
return x>y?x:y;
} struct segment{
int s[N<<],sign[N<<]; void ready()
{
memset(s,,sizeof(s));
memset(sign,,sizeof(sign));
} void pushup(int rt)
{
s[rt]=Max(s[rt<<],s[rt<<|]);
} void pushdown(int rt)
{
if(!sign[rt])return;
s[rt<<]+=sign[rt];
s[rt<<|]+=sign[rt];
sign[rt<<]+=sign[rt];
sign[rt<<|]+=sign[rt];
sign[rt]=;
} void update(int l,int r,int rt,int L,int R,int C)
{
if(l>R||r<L)return;
if(L<=l&&r<=R){
s[rt]+=C;sign[rt]+=C;return;}
int mid=(l+r)>>;
pushdown(rt);
if(L<=mid)update(l,mid,rt<<,L,R,C);
if(R>mid)update(mid+,r,rt<<|,L,R,C);
pushup(rt);
}
}T; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} int main()
{
n=read();m=read();int x,y,z,cnt=,tot=;
for(int i=;i<=n;i++){
x=read();y=read();
a[i].len=y-x;a[i].id=i;
p[++cnt].len=x;p[cnt].id=i;
p[++cnt].len=y;p[cnt].id=i;
}
sort(p+,p+cnt+);
for(int i=;i<=cnt;i++){
x=p[i].id;tot++;
if(!l[x]) l[x]=tot;
else r[x]=tot;
}
sort(a+,a+n+);
inf=tot;T.ready();
int le=,ri=;
ans=;
while(){
while(T.s[]<m&&ri<=n){
z=a[++ri].id;x=l[z];y=r[z];
T.update(,inf,,x,y,);
}
if(T.s[]<m)break;
while(T.s[]>=m&&le<=n){
z=a[++le].id;x=l[z];y=r[z];
T.update(,inf,,x,y,-);
}
ans=min(ans,a[ri].len-a[le].len);
}
if(ans==)ans=-;
printf("%d",ans);
return ;
}
BZOJ4653 [NOI2016]区间 [线段树,离散化]的更多相关文章
- 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 ...
- [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次 修改和询 ...
- BZOJ.4653.[NOI2016]区间(线段树)
BZOJ4653 UOJ222 考虑二分.那么我们可以按区间长度从小到大枚举每个区间,对每个区间可以得到一个可用区间长度范围. 我们要求是否存在一个点被这些区间覆盖至少\(m\)次.这可以用线段树区间 ...
- 洛谷$P1712\ [NOI2016]$区间 线段树
正解:线段树 解题报告: 传送门$QwQ$ $umm$很久以前做的了来补个题解$QwQ$ 考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权 ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
随机推荐
- java类的静态属性值获取
获取某个类实例的静态属性: public class ErrorCode { private String code; private String message; private ErrorCod ...
- 解决HTML5标签兼容的办法搜集
HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显得非常简单. HTML5的新标签元素有: <header&g ...
- Debian sudo自动补全
解决 debian sudo TAB 键不能自动补全命令的原因 一般情况,命令行输入 sudo apt-get ins 按 tab ,它后面会自动补全为 install 如果右面写了包的名的一部分,按 ...
- CF851 C 暴力
给出n个5维下的点,求点a不与其它任意的b,c重合,向量ab,ac的夹角都为钝角,这样的点个数,并打印它们. 转换二维下的求角度的函数为五维的,而且由于要求角度大于90度,在二维情况下最多有4个点,也 ...
- Linux type命令的用法
一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法. 1.判断一个名字当前是否是alias.keyword.function.builtin.file或者什么都不是 ...
- k8s+docker学习连接汇总
http://guide.daocloud.io/dcs/docker-9153982.html http://www.dczou.com/viemall/802.html https://wangl ...
- php跳转网络连接
laravel用 redirect 跳转 HTTP 即可.可以把网址看作路由 例如: if($newsInfo->type == 77){ return redirect('http://192 ...
- nc-使用方法
nc-远程克隆硬盘 A 接收端: nc -lp 333 | dd of=/dev/sda #用nc开启333监听端口 将收到的数据 写入到sda的硬盘上(前提是挂一块硬盘) B ...
- CSS3 object-fit 图像裁剪
MDN定义 https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit 该 object-fit CSS 属性指定替换元素的内容应该如何适应 ...
- fastJson去掉指定字段
public static String filterFieldsJson(Object src, Class<?> clazz, String... args) { SimpleProp ...