P1712 [NOI2016]区间

题目描述

P1712 [NOI2016]区间

Solution

尺取法+线段树

一个显然的想法是按区间长度排序。

每一次多选取一个区间相当于区间覆盖次数加1,每一次少选取一个区间就有区间覆盖次数减1。

可以用线段树维护区间覆盖次数的最大值。

于是转化成了一个Two-Pointers的问题,尺取法扫一遍即可。

时间复杂度   

Code

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=1e6+50;inline int read()
{int x=0,f=1; char c=getchar();while (c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
struct qnode{int opt,id,x,color; } q[MAXN];
int compareq(qnode x,qnode y) { return (x.x<y.x)||(x.x==y.x&&x.opt<y.opt); }
struct anode{int lpre,rpre,lnow,rnow,len; } a[MAXN];
int comparea(anode x,anode y){ return x.len<y.len; }
struct Segment_Tree
{struct segnode{int l,r,tag,mx; } tree[MAXN<<2];void up(int x){ tree[x].mx=max(tree[x<<1].mx,tree[x<<1|1].mx); }void down(int x){if (tree[x].tag!=0){int q=tree[x].tag;tree[x<<1].tag+=q,tree[x<<1].mx+=q;tree[x<<1|1].tag+=q,tree[x<<1|1].mx+=q;tree[x].tag=0;}}void build(int x,int l,int r){if ((tree[x].l=l)==(tree[x].r=r)) return;int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);}int query(int x,int l,int r){if (tree[x].l>=l&&tree[x].r<=r)  return tree[x].mx;down(x);int mid=(tree[x].l+tree[x].r)>>1;if (r<=mid) return query(x<<1,l,r);else if (l>mid) return query(x<<1|1,l,r);else return max(query(x<<1,l,mid),query(x<<1|1,mid+1,r));}void change(int x,int l,int r,int y){if (tree[x].l>=l&&tree[x].r<=r){tree[x].mx+=y;tree[x].tag+=y;return;}down(x);int mid=(tree[x].l+tree[x].r)>>1;if (r<=mid) change(x<<1,l,r,y);else if (l>mid) change(x<<1|1,l,r,y);else change(x<<1,l,mid,y),change(x<<1|1,mid+1,r,y);up(x);}
} segment;
int main()
{int n=read(),m=read(),num=0;for (int i=1;i<=n;i++){int l=read(),r=read();q[++num]=(qnode){0,i,l,0};q[++num]=(qnode){1,i,r,0};}sort(q+1,q+num+1,compareq);q[0].x=-1;for (int i=1;i<=num;i++) {q[i].color=q[i-1].color+(q[i].x!=q[i-1].x);if (q[i].opt==0) a[q[i].id].lpre=q[i].x,a[q[i].id].lnow=q[i].color;if (q[i].opt==1) a[q[i].id].rpre=q[i].x,a[q[i].id].rnow=q[i].color,a[q[i].id].len=a[q[i].id].rpre-a[q[i].id].lpre+1;}sort(a+1,a+n+1,comparea);cout<<endl;for (int i=1;i<=n;i++) cout<<a[i].lpre<<" "<<a[i].rpre<<" "<<a[i].lnow<<" "<<a[i].rnow<<" "<<a[i].len<<endl;segment.build(1,1,q[num].color);int ans=INF;for (int l=1,r=1;r<=n;r++){segment.change(1,a[r].lnow,a[r].rnow,1);while (segment.query(1,1,q[num].color)>=m) {ans=min(ans,a[r].len-a[l].len);segment.change(1,a[l].lnow,a[l].rnow,-1);l++;}}if (ans==INF) puts("-1"); else printf("%d\n",ans);return 0;
}

P1712 [NOI2016]区间相关推荐

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

    [BZOJ4653][Noi2016]区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含 ...

  2. bzoj 4653: [Noi2016]区间(尺取+线段树)

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MB Submit: 934  Solved: 500 [Submit][Status] ...

  3. BZOJ4653 洛谷1712 UOJ222:[NOI2016]区间——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4653 https://www.luogu.org/problemnew/show/P1712 ht ...

  4. [NOI2016]区间-线段树

    一道很巧妙的题. 首先我们需要解决的问题,怎么快速判断选出的m个区间是否存在交. 我们反过来考虑这个问题, 我们每一个选出的区间,就对应的在线段树上区间加1,那么只要存在最大值等于m,就一定有m个区间 ...

  5. [UOJ #222][NOI2016]区间(线段树)

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

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

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

  7. NOI2016区间bzoj4653(线段树,尺取法,区间离散化)

    题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...

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

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

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

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

最新文章

  1. 20 种小技巧,玩转 Google Colab
  2. Codechef July Challenge 2018 : Subway Ride
  3. 3.1 关于半鞅的随机积分(Ren)
  4. linux 433发送驱动
  5. 004-React入门概述
  6. 应用ForkJoin –从最佳到快速
  7. sublime 3143 注册码
  8. 7-32 中位数 (10 分)
  9. One of the two will be used. Which one is undefined.
  10. Linux Redhat下安装Jenkins
  11. 传智播客Java学习之类的继承
  12. 如何将txt文件迅速转为Excel文件
  13. 单片机12864带字库汇编使用教程
  14. PLSQL使用for update编辑数据库的坑
  15. 声音特征提取方法:综述【线性声谱图(Line Spectrum)、对数梅尔谱(Log-mel)、梅尔频率倒谱系数(MFCCs)】
  16. 网页数据提取----网络投票软件开发
  17. Ubuntu 串口调试
  18. WIN7 鼠标右键反应慢如何处理
  19. 微信小程序搭建怎么做?流程是怎么样?【小程序搭建】
  20. 网易患病员工被保安赶出公司,项目经理该如何应对中年危机?

热门文章

  1. 掌握这个姿势,女友不再叨叨叨
  2. 我背着女朋友,用 Python 偷偷抓取了她的行踪
  3. 数学是理工基础,如何才能令人信服?
  4. 10分钟读懂人工智能、机器学习到底有什么关系
  5. sklearn集合算法预测泰坦尼克号幸存者
  6. bytecode java_Java 字节码解读
  7. es6添加删除class_es6中class类的使用
  8. matlab eval函数_matlab自动给变量命名
  9. 7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油
  10. 并查集的相关知识详解 Come baby!!!