【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 ...
随机推荐
- 牛客网 牛客小白月赛1 J.おみやげをまらいました
J.おみやげをまらいました 链接:https://www.nowcoder.com/acm/contest/85/J来源:牛客网 随便写写. 代码: 1 #include<ios ...
- Codeforces Gym100971 C.Triangles-组三角形 (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
这个题就是组三角形,从给出的数组里任选两个和未知的边组三角形. 任意两边之和大于第三边,记住这个就可以了. 代码: 1 #include<cstdio> 2 #include<cst ...
- Guru's Guide to SQL Server Architecture and Internals
Guru's Guide to SQL Server Architecture and Internals
- 查询执行慢的SQL
--执行慢的SQL: SELECT S.SQL_TEXT, S.SQL_FULLTEXT, S.SQL_ID, ROUND(ELAPSED_TIME / 1000000 / (CASE WHEN (E ...
- Android无需权限显示悬浮窗, 兼谈逆向分析app
前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...
- selenium firefox46.0.1设置禁用图片
firefox_profile = webdriver.FirefoxProfile()firefox_profile.set_preference('permissions.default.ima ...
- df、du、fdisk:Linux磁盘管理
磁盘是Linux系统中一项非常重要的资源,如何对其进行有效的管理直接关系到整个系统的性能问题.对Linux磁盘管理稍微有一些学习和经验的朋 友们应该都知道df.du和fdisk这三个常用命令:df用于 ...
- 清空catalina.out报错Permission denied
今天在清空catalina.out的时候报错 [yangkun@sg logs]$ sudo echo '' > catalina.out -bash: catalina.out: Permis ...
- android(cm11)状态栏源代码分析(一)
(一):写在前面 近期因为工作须要,须要了解CM11中的有关于StatusBar相关的内容.总的来说,刚開始阅读其源代码的时候,是有点困难,只是通过构建相关代码的脑图和流程图,几天下来.我已经对其源代 ...
- 红米note3刷安卓原生
http://www.romzj.com/rom/63404.htm#comments-version 然后在系统设置里升级系统, http://www.lineageosdownloads.com/ ...