首先将区间按长度排序后离散化端点(这里的“长度”指的是离散化之前区间的实际长度)

然后模拟一个队列,区间按排好的顺序依次进入,直到某个点被覆盖了M次。之后依次出队,直到所有点都被覆盖小于M次

修改和询问覆盖次数可以用线段树实现

 //C++11 code

 #include <cstdio>
 #include <cstring>
 #include <algorithm>

 ;
 const int inf=0x7f7f7f7f;

 struct Range
 {
     int left,right;
     int len;
     void assign(int l,int r) { left=l; right=r; len=r-l; }
 };

 struct SegTree
 {
     struct Node
     {
         ; //max-val
         ;
         int total() { return val+tag; }
     };
     Node node[maxN<<];
     int size;
     int _val;

     void update(int cur,int right)
     {
         node[cur].val = std::max(node[cur+].total(),node[right].total());
     }
     void add(int L,int R,int val)
     {
         _val=val;
         __add(,L,R+,,size);
     }
     void __add(int cur,int rL,int rR,int nL,int nR)
     {
         if(rL<=nL && rR>=nR)
         {
             node[cur].tag+=_val;
             return;
         }
         ;
         );
         ,rL,rR,nL,mid);
         if(rR>mid) __add(right,rL,rR,mid,nR);
         update(cur,right);
     }
     ].total(); }
 };

 Range rg[maxN];
 SegTree segt;

 int N,M;
 ];
 int valNum;

 void input()
 {
     scanf("%d%d",&N,&M);
     int tl,tr;
     ;i<N;i++)
     {
         scanf("%d%d",&tl,&tr);
         buf[i<<]=tl;
         buf[(i<<)+]=tr;
         rg[i].assign(tl,tr);
     }
 }

 void discretize()
 {
     std::sort(buf,buf+(N<<));
     valNum=std::unique(buf,buf+(N<<))-buf;
     ;i<N;i++)
     {
         rg[i].left=std::lower_bound(buf,buf+valNum,rg[i].left)-buf;
         rg[i].right=std::lower_bound(buf,buf+valNum,rg[i].right)-buf;
     }
 }

 int solve()
 {
     int res=inf;
     auto cmpIdx=[](const Range& A,const Range& B)->bool { return A.len<B.len; };
     std::sort(rg,rg+N,cmpIdx);
     discretize();
     segt.size=valNum;
     ,tail=-;
     )
     {
         while((++head)<N && segt.askAll()<M)
             segt.add(rg[head].left,rg[head].right,);
         if(segt.askAll()<M) break;
         else --head;
         while(segt.askAll()==M)
         {
             ++tail;
             res=std::min(res,rg[head].len-rg[tail].len);
             segt.add(rg[tail].left,rg[tail].right,-);
         }
     }
     :res;
 }

 int main()
 {
     input();
     printf("%d\n",solve());
     ;
 }

UOJ222 NOI2016 区间 线段树+FIFO队列的更多相关文章

  1. BZOJ.4653.[NOI2016]区间(线段树)

    BZOJ4653 UOJ222 考虑二分.那么我们可以按区间长度从小到大枚举每个区间,对每个区间可以得到一个可用区间长度范围. 我们要求是否存在一个点被这些区间覆盖至少\(m\)次.这可以用线段树区间 ...

  2. [NOI2016]区间 线段树

    [NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...

  3. Luogu P1712 [NOI2016]区间(线段树)

    P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...

  4. BZOJ4653 [NOI2016]区间 [线段树,离散化]

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

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

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

  6. 洛谷$P1712\ [NOI2016]$区间 线段树

    正解:线段树 解题报告: 传送门$QwQ$ $umm$很久以前做的了来补个题解$QwQ$ 考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权 ...

  7. BZOJ4653:[NOI2016]区间(线段树)

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

  8. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  9. hdu 1540 Tunnel Warfare (区间线段树(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...

随机推荐

  1. Monkey ‘mk_request_header_process’函数输入验证漏洞

    漏洞名称: Monkey ‘mk_request_header_process’函数输入验证漏洞 CNNVD编号: CNNVD-201308-003 发布时间: 2013-08-22 更新时间: 20 ...

  2. Longest Consecutive Sequence——Leetcode

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  3. Win32中文件的操作

    1 文件的创建或打开 HANDLE CreateFile( LPCTSTR lpFileName, //文件路径和名称 DWORD dwDesiredAccess,      //访问方式,最常用的值 ...

  4. 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)

    命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 原型模式:游戏开发设计模式之原型模式 & unity3d ...

  5. word中MathType公式不能 二次编辑解决方案

    问题:当新建文档然后插入公式,此时可以利用mathtype进行编辑,保存后推出第二次打开,双击公式却发现不能编辑公式. 解决方案: ////////////////////////////////// ...

  6. Unity Flow distort of screen

    Shader "ScreenWater" {Properties { _MainTex ("Base (RGB)", 2D) = "white&quo ...

  7. java基础(八) 面向对象(三)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  8. HDOJ/HDU 2549 壮志难酬(取小数点后几位~)

    Problem Description 话说MCA山上各路豪杰均出山抗敌,去年曾在江湖威名显赫的,江湖人称<万军中取上将首级舍我其谁>的甘露也不甘示弱,"天将降大任于斯人也,必先 ...

  9. php 中 global 与 $GLOBAL 由引用产生的区别

    很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然. 根据官方的解释是 $GLOBALS['var'] 是外部的全局变量$var本身. global $var 是外部$var的 ...

  10. 《University Calculus》-chape8-无穷序列和无穷级数-欧拉恒等式

    写在前面:写在前面的当然是对大天朝教材的吐槽啦. 曾记否,高中所学虚数和复平面的概念,如此虚无的概念到了大学一门叫<模拟电子技术>的课程中居然明目张胆的开始进行计算! 曾记否,高中的指对运 ...