【BZOJ4653】[Noi2016]区间 双指针法+线段树
【BZOJ4653】[Noi2016]区间
Description
Input
Output
Sample Input
3 5
1 2
3 4
2 2
1 5
1 4
Sample Output
题解:这不是我最喜爱的(没有之一)双指针法吗?然而GXZ没等我看题就告诉我正解简直丧心病狂~
因为总代价只和最长区间和最短区间有关,我们将区间按长度排序,那么中间的区间都可以免费取。我们采用双指针法,枚举右端点r,再不断右移l直到[l,r]中的区间刚好满足条件。是否满足条件可以用线段树判定,只需要再每次平移指针的时候维护一下线段树就行了。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=500010;
int n,m,nm,ans;
int s[maxn<<4],t[maxn<<4];
struct node
{
int len,a,b;
}p[maxn];
struct number
{
int val,org,k;
}num[maxn<<1];
bool cmp1(node a,node b)
{
return a.len<b.len;
}
bool cmp2(number a,number b)
{
return a.val<b.val;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void updata(int l,int r,int x,int a,int b,int v)
{
if(a<=l&&r<=b)
{
s[x]+=v,t[x]+=v;
return ;
}
if(t[x]) s[lson]+=t[x],s[rson]+=t[x],t[lson]+=t[x],t[rson]+=t[x],t[x]=0;
int mid=l+r>>1;
if(a<=mid) updata(l,mid,lson,a,b,v);
if(b>mid) updata(mid+1,r,rson,a,b,v);
s[x]=max(s[lson],s[rson]);
}
int main()
{
n=rd(),m=rd();
int i,j;
for(i=1;i<=n;i++)
num[i].val=rd(),num[i+n].val=rd(),num[i].org=num[i+n].org=i,num[i+n].k=1,p[i].len=num[i+n].val-num[i].val;
sort(num+1,num+2*n+1,cmp2);
num[i-1].val=-1;
for(i=1;i<=2*n;i++)
{
if(num[i].val>num[i-1].val) nm++;
if(num[i].k) p[num[i].org].b=nm;
else p[num[i].org].a=nm;
}
sort(p+1,p+n+1,cmp1);
ans=1<<30;
for(i=1;i<=n&&s[1]<m;updata(1,nm,1,p[i].a,p[i].b,1),i++);
if(i>n&&s[1]<m)
{
printf("-1");
return 0;
}
i--,updata(1,nm,1,p[i].a,p[i].b,-1);
for(j=1;i<=n;i++)
{
for(updata(1,nm,1,p[i].a,p[i].b,1);j<=i&&s[1]>=m;updata(1,nm,1,p[j].a,p[j].b,-1),j++);
j--,updata(1,nm,1,p[j].a,p[j].b,1);
ans=min(ans,p[i].len-p[j].len);
}
printf("%d",ans);
return 0;
}
//6 3 3 5 1 2 3 4 2 2 1 5 1 4
【BZOJ4653】[Noi2016]区间 双指针法+线段树的更多相关文章
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- [BZOJ4653][NOI2016]区间 贪心+线段树
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...
- BZOJ4653 [NOI2016] 区间 【线段树】
题目分析: 首先思考一个二分答案的做法.我们可以注意到答案具有单调性,所以可以二分答案. 假设当前二分的答案是$ k $.那么按照大小顺序插入每个区间,同时在末端删除会对答案产生影响的区间.这里不妨用 ...
- 2018.08.17 bzoj4653: [Noi2016]区间(线段树+尺取法)
传送门 将坐标离散化之后直接用尺取法(双指针)+线段树维护. 其实就是说只要目前所有点的被覆盖次数是大于等于m的就移动左指针删除区间更新答案,否则移动右指针加入区间更新答案. 话说忘记排序以及建树的时 ...
- BZOJ4653 [NOI2016]区间 [线段树,离散化]
题目传送门 区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就 ...
- BZOJ4653: [Noi2016]区间(线段树 双指针)
题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...
- 【NOI2016】区间 题解(线段树+尺取法)
题目链接 题目大意:给定$n$个区间$[l_i,r_i]$,选出$m$个区间使它们有一个共同的位置$x$,且使它们产生的费用最小.求最小费用.费用定义为最长的区间长度减去最短区间长度. ------- ...
- BZOJ4653: [Noi2016]区间
传送门 UOJ上卡掉一个点,COGS上卡掉两个点..弃疗,不改了,反正BZOJ上过啦hhh 先把区间按长度递增排序.然后每次用线段树维护区间最大覆盖次数,用一个指针随便扫扫就行了. //NOI 201 ...
随机推荐
- 【转】java8中谨慎使用实数作为HashMap的key!
java8中谨慎使用实数作为HashMap的key! java8中一个hashCode()函数引发的血案java8中一个hashCode()函数引发的血案1.起因2.实数的hashCode()3.总结 ...
- Python--Day2/Day3/Day4(运算符、数据类型及内建函数)
一.昨日内容回顾 Python种类:CPython(Python).JPython.IronPython.PyPy 编码: Unicode.UTF-8.GBK while循环 if...elif... ...
- 关于Sending build context to Docker daemon 数据很大的问题
以往进行docker build的时候都是在新建的文件夹下面进行,这次为了图方便,就直接放在开发根目录下进行build,这样子问题就来了.于是就有了下面的文件大小发送量: Sending build ...
- DbVisualizer9.0.6破解版下载、破解方法以及补丁
DbVisualizer破解方法如下:第一步:把下载的dbvis.puk文件,替换掉安装目录“D:\Program Files\DbVisualizer-6.0.12\lib”下dbvis.jar里面 ...
- 【共享单车】—— React后台管理系统开发手记:Router 4.0路由实战演练
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 转: 学习Javascript闭包(Closure) (阮一峰)
from: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
- 测试整合之王Unitils
16.4.1 Unitils概述(1) Unitils测试框架目的是让单元测试变得更加容易和可维护.Unitils构建在DbUnit与EasyMock项目之上并与JUnit和TestNG相结合.支持 ...
- java 环境变量配置 Mac
大家在windows里面配置JDK环境变量很容易,但是如果要在mac里面配置JDK环境变量和windows里面有所不同,具体如下: 第一: mac OS里面自带jdk,不过是1.6的版本,现在很多人使 ...
- OpenStack 安装教程(使用Fuel )
OpenStack Fuel 安装教程 1介绍 OpenStack 是由 Rackspace 和 NASA 共同开发的云计算平台,帮助服务商和企业内部实现类似于 Amazon EC2 和 S3 的云基 ...
- linux 查找并操作
find -depth 1 -name 'aa*' | xargs tar -cvf aa.tar 这个命令将为查找当前目录下的所有已aa开头的文件,然后将所有结果"执行打包",打 ...