【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 ...
随机推荐
- LeetCode OJ-- Reorder List **
https://oj.leetcode.com/problems/reorder-list/ 将一个链表重新排序,比如 1 2 3 4 5,变成 1 5 2 4 3 1.找到中间节点 mid 2.将链 ...
- Best Cow Fences
题目描述 Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field cont ...
- luogu P1027 Car的旅行路线
题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位 ...
- hosts不支持泛解析
hosts不支持泛解析,只能是一个域名对应一个IP. 如果想要实现只能用一些第三方的DNS软件做解析.
- 谷歌浏览器chrome设置特定网页使用Https(ssl)访问
1.在浏览器上输入: chrome://net-internals/ 2.在以下位置输入要自动进行https访问的域名即可. 注意:域名不能用范解析,只能一个一个手动输入.
- c++ 幕客网
http://m.imooc.com/course/list.html?c=cplusplus http://coding.imooc.com/ http://www.imooc.com/act/al ...
- iOS申请证书,Certificates, Identifiers &Profiles 简介 - 申请证书
在真机调试以及发布应用时,要申请证书,我们必须知道Certificates, Identifiers ,Profiles 是什么含义,下面对它们做简单介绍,以及如果申请证书. Certificates ...
- EasyMvc入门教程-入门
1.EasyMvc简介 EasyMvc主要是为了丰富asp.net core mvc控件而出现的: 它提倡简单,面向对象式开发,希望能快速开发的同时,仍然保持一定的灵活性. 2.EasyMvc初相识 ...
- 【重点突破】—— Vue1.0到Vue2.0的变化
前言: 本文参考作者:_So_ 和 我是某慧 的博文,重点梳理Vue1.0升级到Vue2.0后在开发中要注意的不同,以做学习. 组件模板不再支持片段代码,必须有一个顶级元素包裹,例如: ...
- 【重点突破】——使用Canvas进行绘图图像
一.引言 本文主要是canvas绘图中绘制图像的部分,做了几个练习,综合起来,复习canvas绘图以及定时器的使用. 二.canvas绘制小飞机在指定位置 <!DOCTYPE html> ...