不得不说,这也许会是一道长期在我的博客里作为“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. listener单点登录和在线人数

    1,jsp提交一个form 2,把收集到的数据放到一个personInfo类中,personInfo类放进session中 3,添加的时候触发listener,把一个personInfo的accoun ...

  2. ubuntu12.04LTS安装以及卸载 QT4.8.6和QT creator2.5.2

    鉴于,下载QT5.5安装,编译总是有问题,可能是配置不正确. 于是按照论坛的一些资料,就换回QT4版本,具体实施步骤如下: 在qt官网http://download.qt.io/archive/ 下的 ...

  3. CF 1093G Multidimensional Queries——线段树(消去绝对值符号)

    题目:http://codeforces.com/contest/1093/problem/G 只好看看题解:https://codeforces.com/blog/entry/63877 主要是把绝 ...

  4. JVM内存管理之GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  5. xsd解析

    1. 解释: <xsd:element name="interceptors"> <xsd:annotation> 这一块是对第一行的注解(解释) < ...

  6. struts2学习(15)struts2防重复提交

    一.重复提交的例子: 模拟一种情况,存在延时啊,系统比较繁忙啊啥的. 模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况: 这样会造成重复提交:   com.cy.action.St ...

  7. 【转】JMeter技巧集锦

    JMeter是一个流行的用于负载测试的开源工具,具有许多有用的功能元件,如线程组(threadgroup),定时器(timer),和HTTP取样(sampler)元件.本文是对JMeter用户手册的补 ...

  8. solr核心概念、配置文件

    Document Document是Solr索引(动词,indexing)和搜索的最基本单元,它类似于关系数据库表中的一条记录,可以包含一个或多个字段(Field),每个字段包含一个name和文本值. ...

  9. 为什么 JSON 接口的数据都要加双引号!!!不能用单引号

    原因是:Javascript 在很多时候会把 JSON 对象里面没有双引号包围的值,当做数值处理.比如: {"a":987654321} 这个 JSON 里头的变量 a,会被当做一 ...

  10. Codeforces-708C(树形DP)

    一.题意 给定一颗树,对于每一个节点,判断能否在树中删除某一条边,然后在任意两个节点之间加一条边,使这个点成为重心. 注:删除树中某一条边后,标程并不会这么无聊地把这棵树变成两个孤立的连通图,而是再让 ...