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 个区间, ...
随机推荐
- 使用tqdm组件构造程序进度条
使用tqdm组件构造程序进度条 觉得有用的话,欢迎一起讨论相互学习~Follow Me 主要代码 import tqdm # 引用tqdm组件 TRAIN_STEPS = N for i in tqd ...
- dp+分类讨论 Gym 101128E
题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/detail ...
- 2-sat基础题 uvalive 3211
蓝书325页的基础题 二分+2-sat //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using n ...
- 816C. Karen and Game 贪心
LINK 题意:给出n*m的矩阵图,现有对行或对列上的数减1的操作,问最少几步使所有数变为0,无解输出-1 思路:贪心暴力即可.先操作行和先操作列结果可能不同注意比较. /** @Date : 201 ...
- [Luogu 1967] NOIP2013 货车运输
[Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...
- javascript 获取函数形参
/** * 获取函数的形参个数 * @param {Function} func [要获取的函数] * @return {*} [形参的数组或undefind] */ function getFunc ...
- wepy开发小程序 大坑....本地调试ok,小程序上传体验版 组件出现问题
如果你碰到的上述问题(本地调试ok,小程序上传体验版 各种莫名其妙的问题-卡死-组件属性失效-$apply()不起作用) 您需要关闭 微信开发者工具中: 1.微信开发者工具-->项目--> ...
- APP爬虫之Appium使用
一.安装环境 Appium安装(windows版) 一.安装node.js 1.到官网下载node.js:https://nodejs.org/en/download/ 2.获取到安装文件后,直接双击 ...
- Django之利用ajax实现图片预览
利用ajax实现图片预览的步骤为: 程序实现的方法为: 方法一: upload.html <!DOCTYPE html> <html lang="en"> ...
- spring boot注解学习记
@Component Compent等效于xml文件中的Bean标注,Autowired自动初始化Bean是通过查找Component注解实现的,在增加Component后还是Autowired找不到 ...