不得不说,这也许会是一道长期在我的博客里作为“HARD”难度存在的题

  这道题能很好的考验选手的思考能力,但本蒟蒻最后还是听了省队爷讲了之后才会。。。(默默面壁)

  题目里,说对于每一个点,是用当前选出的M个里面,最长长度减去最短长度作为价值。也就是说:选择长度介于最长与最短之间的边,是对答案没有影响的。(本蒟蒻并没有想到这一点。。。)

  所以由于这一点,我们可以先对于边的长度排序。

  那么题目中提到的M,是“选中多余或等于M条边”,从这里就可以看出,我们只需要选定一个头和一个尾就好,由此可以看出,这个子问题完全可以用尺取法处理。

  以尺取法不停更新最优解就好啦。

  那么怎么处理M捏,其实很简单,用离散化加线段树就可以解决关于“M个点“的子问题。

  直接甩题目&代码

  

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
 /**************************************************************
Problem: 4653
User: PencilWang
Language: C++
Result: Accepted
Time:12896 ms
Memory:87320 kb
****************************************************************/ #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
using namespace std;
struct shit1{int L,R,lon;}e[];
struct shit2{int L,R,lazy,num;}s[];
int fucker[];
int ans,n,m,k;
bool cmp(shit1 a,shit1 b)
{
return a.lon<b.lon;
}
void push_down(int p)
{
int L=p<<,R=p<<|;
s[L].num+=s[p].lazy;
s[L].lazy+=s[p].lazy;
s[R].lazy+=s[p].lazy;
s[R].num+=s[p].lazy;
s[p].lazy=;
return ;
}
void push_up(int p)
{
s[p].num=max(s[p<<].num,s[p<<|].num);
return ;
}
void build(int p,int L,int R)
{
s[p].L=L,s[p].R=R;
if(L==R)return ;
int mid=(L+R)>>;
build(p<<,L,mid);
build(p<<|,mid+,R);
return ;
}
void add(int a,int b,int p,int num)
{
if(a<=s[p].L&&s[p].R<=b)
{
s[p].num+=num;
s[p].lazy+=num;
return ;
}
push_down(p);
int mid=(s[p].L+s[p].R)>>;
if(a<=mid)add(a,b,p<<,num);
if(b>mid)add(a,b,p<<|,num);
push_up(p);
return ;
}
set<int>sb;
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
scanf("%d%d",&e[i].L,&e[i].R);
sb.insert(e[i].L);sb.insert(e[i].R);
e[i].lon=e[i].R-e[i].L+;
}
for(set<int>::iterator p=sb.begin();p!=sb.end();++p)
fucker[++m]=*p;
build(,,m);
sort(e+,e+n+,cmp);
for(int i=;i<=n;i++)
{
e[i].L=lower_bound(fucker+,fucker+m+,e[i].L)-fucker;
e[i].R=lower_bound(fucker+,fucker+m+,e[i].R)-fucker;
}
int L=,R=;
int Lz=e[].lon,Rz=e[].lon;
while(e[R].lon==Rz)
add(e[R].L,e[R].R,,),R++;
R--;
ans=0x3f3f3f3f;
while(L<=R&&R<=n)
{
if(s[].num>=k)
{
ans=min(ans,Rz-Lz);
while(e[L].lon==Lz)
add(e[L].L,e[L].R,,-),L++;
Lz=e[L].lon;
}
else
{
Rz=e[++R].lon;
while(e[R].lon==Rz&&R<=n)
add(e[R].L,e[R].R,,),R++;
if(R==n+)break;
R--;
}
}
if(ans==0x3f3f3f3f)ans=-;
printf("%d",ans);
return ;
}

刷题向》关于一道尺取法的神题目(BZOJ4653)(HARD-)(BZOJ 30题纪念)的更多相关文章

  1. codeforces #364c They Are Everywhere 尺取法

    C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  2. hdu 5672 String 尺取法

    String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem D ...

  3. HDU 4123 (2011 Asia FZU contest)(树形DP + 维护最长子序列)(bfs + 尺取法)

    题意:告诉一张带权图,不存在环,存下每个点能够到的最大的距离,就是一个长度为n的序列,然后求出最大值-最小值不大于Q的最长子序列的长度. 做法1:两步,第一步是根据图计算出这个序列,大姐头用了树形DP ...

  4. 洛谷P1638 逛画展 (尺取法)

    尺取法的经典题目: 博览馆正在展出由世上最佳的 mm 位画家所画的图画. 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所 ...

  5. BestCoder Round #86 二,三题题解(尺取法)

    第一题太水,跳过了. NanoApe Loves Sequence题目描述:退役狗 NanoApe 滚回去学文化课啦! 在数学课上,NanoApe 心痒痒又玩起了数列.他在纸上随便写了一个长度为 nn ...

  6. POJ 3320 尺取法(基础题)

    Jessica's Reading Problem Description Jessica's a very lovely girl wooed by lots of boys. Recently s ...

  7. hdu 5056(尺取法思路题)

    Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. poj 2566 Bound Found(尺取法 好题)

    Description Signals of most probably extra-terrestrial origin have been received and digitalized by ...

  9. 【尺取法好题】POJ2566-Bound Found

    [题目大意] 给出一个整数列,求一段子序列之和最接近所给出的t.输出该段子序列之和及左右端点. [思路] ……前缀和比较神奇的想法.一般来说,我们必须要保证数列单调性,才能使用尺取法. 预处理出前i个 ...

随机推荐

  1. 超详细的celery异步任务和定时任务的教程

    转载自:https://segmentfault.com/a/1190000007780963

  2. UML基本架构建模--类的术语和概念

     Terms and Concepts 术语和概念   A classis a description of a set of objects that share the same attrib ...

  3. WINDOWS下kill进程的命令

    相信大家都有用命令行(CMD)解决问题的习惯,起码我感觉自己在处理Windows系统故障时越来越离不开Windows PE了,今天我想介绍两个很实用的命令:Tasklist与Tskill.命令:Tas ...

  4. IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件

    IMP-00013: only a DBA can import a file exported by another DBA 处理方法:在给目标环境的用户赋予dba权限,或者细粒度一些,赋予imp_ ...

  5. 什么是YARN

    YARN的核心组件: 1)ResourceManager,扮演Master角色(和HDFS的nameNode很像)主要用于资源分配:RM有两个子组件,分别是Scheduler(Capacity Sch ...

  6. 网络流量监控分析工具 Ntopng 安装

    官方说明:http://packages.ntop.org/      http://packages.ntop.org/centos-stable/   http://packages.ntop.o ...

  7. python下很帅气的爬虫包 - Beautiful Soup 示例

    先发一下官方文档地址.http://www.crummy.com/software/BeautifulSoup/bs4/doc/ 建议有时间可以看一下python包的文档. Beautiful Sou ...

  8. virtual Box centos7 公司网络环境下不能联网的解决方案

    首先感谢@采蘑菇的东峰的博客 的分享 原文:http://blog.sina.com.cn/s/blog_8d92d7580102vhky.html ------------------------- ...

  9. SpringMVC日志管理(自定义异常及自定义注解)

    近期为了规范公司老旧项目的日志,主要也是为了便于日后错误排查以及加强对业务系统的监控,准备对原有的日志输出进行简单的改造. 解决思路 1.通过自定义异常来将可能出现的问题分为两大类,业务类及系统类.同 ...

  10. 命令行创建2003的IP安全策略

      IP安全策略从win2k到2003都有的,图形界面的没什么好说的,如何在命令行下控制IPSec呢?win2k的方法在Do All in Cmd Shell有介绍.这里就拿win2003做例子吧,毕 ...