【BZOJ4653】[Noi2016]区间

Description

在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。
对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左端点的值。
求所有合法方案中最小的花费。如果不存在合法的方案,输出 −1。

Input

第一行包含两个正整数 n,m用空格隔开,意义如上文所述。保证 1≤m≤n
接下来 n行,每行表示一个区间,包含用空格隔开的两个整数 li 和 ri 为该区间的左右端点。
N<=500000,M<=200000,0≤li≤ri≤10^9

Output

只有一行,包含一个正整数,即最小花费。

Sample Input

6 3
3 5
1 2
3 4
2 2
1 5
1 4

Sample Output

2

题解:这不是我最喜爱的(没有之一)双指针法吗?然而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

转载于:https://www.cnblogs.com/CQzhangyu/p/7130202.html

【BZOJ4653】[Noi2016]区间 双指针法+线段树相关推荐

  1. 【bzoj4653】[Noi2016]区间 双指针法+线段树

    题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...

  2. 【BZOJ4653】区间,离散化+线段树

    Time:2016.08.09 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 当时打同步赛的时候 花了3h去做T3提答 大概玩了50分 回来看T1竟然是懵逼状态-- 想了一会,满脑 ...

  3. BZOJ4653: [Noi2016]区间(线段树 双指针)

    题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...

  4. luogu P5142 区间方差(线段树、乘法逆元)

    luogu P5142 区间方差 本题要求维护模区间方差,很明显是一道数据结构题. 我们化简方差公式: 而平均数等于 可以发现,我们只需要维护序列的区间和和区间平方和,就可以维护平均数和方差. 区间和 ...

  5. 题解【bzoj4653 [NOI2016] 区间】

    先按照长度排个序,然后依次添加区间.什么是添加?设这个区间是\([l,r]\),添加就是把\(a_l,a_{l+1},a_{l+2},{...},a_{r}\)都加上\(1\),其中\(a_i\)表示 ...

  6. HDU 4553 约会安排 (区间合并)【线段树】

    <题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们 ...

  7. P6327 区间加区间sin和 线段树 + 数学

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,有mmm次操作,每次操作分两种类型: (1)l,r,v(1)l,r,v(1)l,r,v,将al,al+1,...,ara_l ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值

    这道题相对简单下面是题目: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6542 Solve ...

最新文章

  1. 网络犯罪:令牌化和区块链将终结数据盗窃行为?
  2. ksql 数量大于2_别人1加1大于2大于3,雍禾植发1加1小于2……
  3. LightCounting预测以太网光模块市场未来5年18%增速
  4. Android4.0的Alertdialog对话框,设置点击其他位置不消失
  5. mybatis expected at least 1 bean which qualifies as autowire candidate for this dependency
  6. 鸿蒙os系统作用,华为再发新版鸿蒙OS系统!新增超级终端功能:可媲美iOS系统...
  7. seL4操作系统基础01:seL4 whitepaper概览
  8. 微软十月补丁星期二值得关注的0day及其它
  9. resource和autowired
  10. 手机网站前端开发经验总结
  11. 如何将苹方字体写入html,在网页上使用苹方字体
  12. 扔物线新一期 HenCoder Plus 高级进阶课程开课喽!
  13. 阿里云服务器安全警告-异常网络连接-访问恶意域名
  14. VR Masterclass
  15. 饿狼传说 | 千锋JavaScript教程千呼万唤已出来
  16. 勒索病毒现状和防御勒索病毒最佳实践(云端和线下个人电脑,服务器都可部署)
  17. feign+hystrix相关超时时间配置问题
  18. iOS内存扫描工具实现
  19. 计算机内存与外存有什么特点,为什么计算机要分内存与外存,内存与外存各有什么特点?...
  20. 关键字驱动自动化测试

热门文章

  1. 是否可以限制蓝牙传输距离_技术文章—关于蓝牙传输范围的常见误解
  2. http 二进制_浅谈HTTP协议
  3. 从源码角度剖析VC6下的内存分配与切割的运作
  4. c#异常处理_C#中的异常处理
  5. 如果__name__ =='__main__':在Python中怎么办?
  6. 最小连通-(代码、分析、汇编)
  7. linux 内核配置 dns,linux bind dns简单配置
  8. MySQL 纯insert_MySQL使用INSERT插入多条记录
  9. 多层感知机和神经网络的区别_学习笔记-从神经元到神经网络
  10. vc 6.0 显示文件全路径_配送路径规划思考(十二)