不得不说,这也许会是一道长期在我的博客里作为“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. win10安装.net3.5 报错解决

    在win10光盘里提取“microsoft-windows-netfx3-ondemand-package.cab”安装包 然后放在sxs目录 新建批处理...??Cls@ECHO OFFTITLE ...

  2. 一次解决spark history server日志不见

    通过cloudera的旧版VM(centos6版本)跑spark,之后,想看一下日志研究一下job,stage以及task,压力很大的发现完全没有日志,180088页面打开后: Event log d ...

  3. bzo1007 [HNOI2008]水平可见直线

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1007 所有可见直线形成下凸壳的样子.而且交点横坐标递增. (特殊判断平行线.但是按b从小到大 ...

  4. 项目代码部署百度云(使用git部署,node环境)

    学习做了一个小demo,总是在自己的电脑,和局域网上运行很没意思,现在就做点有意思的事情,将代码部署百度云. 1)首先你得进入百度云(直接百度,先要注册一个账号) 2)点击那个“应用引擎”,就会进入 ...

  5. Linux proc_mkdir和proc_create的用法

    //功能:在proc中创建一个文件夹 //参数1:创建的文件夹名称 //参数2:创建的文件夹路径,就是在哪个文件夹中创建,如果是proc根目录,此参数为NULL //返回值:创建的文件夹路径 stru ...

  6. 软件设计----LisKov替换原则(LSP)

    LisKov替换原则的定义:一个软件实体如果使用的是一个基类的话,一定适用于其子类,而且根本不能觉察出基类对象和子类对象的区别. 1)怎么理解上面的概念?就是我们程序设计的子类型能够完全替换父类型,而 ...

  7. PPP PDP 及GPRS

    1.相关概念: PDP:Packet Data Protocol 分组数据协议 PLMN:Public Land Mobile Network,公共陆地移动网络 APN:Access Point Na ...

  8. curl 无法访问 https 协议

    转自http://blog.mutoo.im/2013/12/curl-could-not-communicate-with-https-sites.html mac升级为10.10以后,homebr ...

  9. (转)Inno Setup入门(十)——操作注册表

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250871 有些程序需要随系统启动,或者需要建立某些文件关联等问题 ...

  10. python 面向对象(类的特殊成员)

    python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...