先把区间按照长度从小到大排序,然后用尺取法来做

大概就是先一点一点把区间算上 直到某个点被覆盖了m次,然后一点一点把最前面的区间扔掉,直到没有点被覆盖m次,这样反复做(相当于是它选择的区间左右端点在那里摩擦)

判断有没有点被覆盖m次可以用线段树来做

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=; inline int read(){
char c=getchar();int a=;
while(c<''||c>'') c=getchar();
while(c>=''&&c<=''){a=a*+c-'';c=getchar();}
return a;
} struct ST{
int x,id;bool isl;
}nd[maxn*];
struct Line{
int l,r,siz;
}ln[maxn];
struct Node{
int l,r,num,laz;
}tr[maxn*]; int M,N; inline bool cmp1(ST a,ST b){return a.x<b.x;}
inline bool cmp2(Line a,Line b){return a.siz<b.siz;} void build(int i,int l,int r){
tr[i].l=l;tr[i].r=r;tr[i].num=tr[i].laz=;
if(l>=r) return;
int m=(l+r)>>;build(i<<,l,m);build(+(i<<),m+,r);
} inline void pushdown(int i){
if(!tr[i].laz) return;
if(tr[i].l==tr[i].r){tr[i].laz=;return;}
int l=i<<,r=(i<<)+;
tr[l].num+=tr[i].laz;tr[r].num+=tr[i].laz;
tr[l].laz+=tr[i].laz;tr[r].laz+=tr[i].laz;
tr[i].laz=;return;
}
inline void update(int i){if(tr[i].l<tr[i].r)tr[i].num=max(tr[i<<].num,tr[(i<<)+].num);} void add(int i,int l,int r,int x){
if(tr[i].l==l&&tr[i].r==r){tr[i].num+=x;tr[i].laz+=x;return;}
int m=(tr[i].l+tr[i].r)>>;pushdown(i);
if(l<=m) add(i<<,l,min(m,r),x);
if(r>m) add((i<<)+,max(l,m+),r,x);
update(i);
} int main(){
int i,j,k,ans=0x7fffffff;
N=read();M=read();
for(i=;i<=N;i++){
ln[i].l=read();ln[i].r=read();ln[i].siz=ln[i].r-ln[i].l;
nd[i].x=ln[i].l;nd[i].id=i;nd[i].isl=;
nd[i+N].x=ln[i].r;nd[i+N].id=i;nd[i+N].isl=;
}sort(nd+,nd+N*+,cmp1);
for(i=,j=;i<=N*;i++){
if(nd[i].x!=nd[i-].x) j++;
if(nd[i].isl) ln[nd[i].id].l=j;
else ln[nd[i].id].r=j;
}sort(ln+,ln+N+,cmp2); build(,,N*);
for(i=,j=;i<=N;i++){
add(,ln[i].l,ln[i].r,);
if(tr[].num>=M){
while(tr[].num>=M){j++;add(,ln[j].l,ln[j].r,-);}
ans=min(ans,ln[i].siz-ln[j].siz);
}
}
if(ans!=0x7fffffff) printf("%d",ans);
else printf("-1");
}

luogu1712 区间 (尺取法+线段树)的更多相关文章

  1. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  2. codeforces 652C C. Foe Pairs(尺取法+线段树查询一个区间覆盖线段)

    题目链接: C. Foe Pairs time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  3. luogu P1712 [NOI2016]区间 贪心 尺取法 线段树 二分

    LINK:区间 没想到尺取法. 先说暴力 可以发现答案一定可以转换到端点处 所以在每个端点从小到大扫描线段就能得到答案 复杂度\(n\cdot m\) 再说我的做法 想到了二分 可以进行二分答案 从左 ...

  4. BZOJ4653 尺取法 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4653 首先很容易想到离散之后排序,用线段树或者树状数组去维护. 问题在于按照什么排序,如果按照左端 ...

  5. 线段树:CDOJ1597-An easy problem C(区间更新的线段树)

    An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  6. 【NOI2016】区间 题解(线段树+尺取法)

    题目链接 题目大意:给定$n$个区间$[l_i,r_i]$,选出$m$个区间使它们有一个共同的位置$x$,且使它们产生的费用最小.求最小费用.费用定义为最长的区间长度减去最短区间长度. ------- ...

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

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

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

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

  9. HDU 1540 Tunnel Warfare(经典)(区间合并)【线段树】

    <题目链接> 题目大意: 一个长度为n的线段,下面m个操作 D x 表示将单元x毁掉 R  表示修复最后毁坏的那个单元 Q x  询问这个单元以及它周围有多少个连续的单元,如果它本身已经被 ...

随机推荐

  1. KVM虚拟机管理——资源调整

    1. 概述2. 计算资源调整2.1 调整处理器配置2.2 调整内存配置3. 存储资源调整3.1 根分区扩展3.2 添加磁盘4. 网络资源调整 1. 概述 KVM在使用过程中,会涉及到计算(CPU,内存 ...

  2. Mysql读写分离方案-Amoeba环境部署记录

    Mysql的读写分离可以使用MySQL Proxy,也可以使用Amoeba.Amoeba(变形虫)项目是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项 ...

  3. python-编码-15

    ascii A : 00000010 8位 一个字节 unicode A : 00000000 00000001 00000010 00000100 32位 四个字节 中:00000000 00000 ...

  4. 基于bootstrap表单登录(带验证码)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!-- ...

  5. 作用域&作用域链和with,catch语句&闭包

    作用域(函数) 作用域:变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期; 在一些类C编程语言中花括号内的每一段代码都有各自的作用域,而且变量在声明它们的代码段外是不可见的,称之为块 ...

  6. Eddy's mistakes HDU

    链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1161] 题意 把字符串中大写字母变为小写 . 分析 主要是含有空格的字符串如何读入,用getline(c ...

  7. PairProject——结对编程

    成员:12061162  王骜 12061225  钟毅恒 一.合作过程中的照片 . 二.结对编程的优缺点 优点: 1)在编程过程中,任何一段代码都不断地复审,同时避免了将写代码的责任抛给一个人的问题 ...

  8. individual reading task ---12061183 叶露婷

    Different people deserve different tasks; Once team roles are settled, there comes along a lot of ot ...

  9. Linux内核分析——ELF文件格式分析

    ELF文件(目标文件)格式主要三种: 1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为 ...

  10. This Android SDK requires Android Developer Toolkit version 17.0.0 or above. Current version is 10.0.0.v201102162101-104271. Please update ADT to the latest version.

    win7/xp 下面安装Android虚拟机,更新SDK后,在Eclipse preference里指向android-sdk-windows时. 出现 : This Android SDK requ ...