刷题向》关于一道尺取法的神题目(BZOJ4653)(HARD-)(BZOJ 30题纪念)
不得不说,这也许会是一道长期在我的博客里作为“HARD”难度存在的题
这道题能很好的考验选手的思考能力,但本蒟蒻最后还是听了省队爷讲了之后才会。。。(默默面壁)
题目里,说对于每一个点,是用当前选出的M个里面,最长长度减去最短长度作为价值。也就是说:选择长度介于最长与最短之间的边,是对答案没有影响的。(本蒟蒻并没有想到这一点。。。)
所以由于这一点,我们可以先对于边的长度排序。
那么题目中提到的M,是“选中多余或等于M条边”,从这里就可以看出,我们只需要选定一个头和一个尾就好,由此可以看出,这个子问题完全可以用尺取法处理。
以尺取法不停更新最优解就好啦。
那么怎么处理M捏,其实很简单,用离散化加线段树就可以解决关于“M个点“的子问题。
直接甩题目&代码
Description
Input
Output
Sample Input
3 5
1 2
3 4
2 2
1 5
1 4
Sample Output
/**************************************************************
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题纪念)的更多相关文章
- codeforces #364c They Are Everywhere 尺取法
C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- hdu 5672 String 尺取法
String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- HDU 4123 (2011 Asia FZU contest)(树形DP + 维护最长子序列)(bfs + 尺取法)
题意:告诉一张带权图,不存在环,存下每个点能够到的最大的距离,就是一个长度为n的序列,然后求出最大值-最小值不大于Q的最长子序列的长度. 做法1:两步,第一步是根据图计算出这个序列,大姐头用了树形DP ...
- 洛谷P1638 逛画展 (尺取法)
尺取法的经典题目: 博览馆正在展出由世上最佳的 mm 位画家所画的图画. 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所 ...
- BestCoder Round #86 二,三题题解(尺取法)
第一题太水,跳过了. NanoApe Loves Sequence题目描述:退役狗 NanoApe 滚回去学文化课啦! 在数学课上,NanoApe 心痒痒又玩起了数列.他在纸上随便写了一个长度为 nn ...
- POJ 3320 尺取法(基础题)
Jessica's Reading Problem Description Jessica's a very lovely girl wooed by lots of boys. Recently s ...
- hdu 5056(尺取法思路题)
Boring count Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- poj 2566 Bound Found(尺取法 好题)
Description Signals of most probably extra-terrestrial origin have been received and digitalized by ...
- 【尺取法好题】POJ2566-Bound Found
[题目大意] 给出一个整数列,求一段子序列之和最接近所给出的t.输出该段子序列之和及左右端点. [思路] ……前缀和比较神奇的想法.一般来说,我们必须要保证数列单调性,才能使用尺取法. 预处理出前i个 ...
随机推荐
- 超详细的celery异步任务和定时任务的教程
转载自:https://segmentfault.com/a/1190000007780963
- UML基本架构建模--类的术语和概念
Terms and Concepts 术语和概念 A classis a description of a set of objects that share the same attrib ...
- WINDOWS下kill进程的命令
相信大家都有用命令行(CMD)解决问题的习惯,起码我感觉自己在处理Windows系统故障时越来越离不开Windows PE了,今天我想介绍两个很实用的命令:Tasklist与Tskill.命令:Tas ...
- IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件
IMP-00013: only a DBA can import a file exported by another DBA 处理方法:在给目标环境的用户赋予dba权限,或者细粒度一些,赋予imp_ ...
- 什么是YARN
YARN的核心组件: 1)ResourceManager,扮演Master角色(和HDFS的nameNode很像)主要用于资源分配:RM有两个子组件,分别是Scheduler(Capacity Sch ...
- 网络流量监控分析工具 Ntopng 安装
官方说明:http://packages.ntop.org/ http://packages.ntop.org/centos-stable/ http://packages.ntop.o ...
- python下很帅气的爬虫包 - Beautiful Soup 示例
先发一下官方文档地址.http://www.crummy.com/software/BeautifulSoup/bs4/doc/ 建议有时间可以看一下python包的文档. Beautiful Sou ...
- virtual Box centos7 公司网络环境下不能联网的解决方案
首先感谢@采蘑菇的东峰的博客 的分享 原文:http://blog.sina.com.cn/s/blog_8d92d7580102vhky.html ------------------------- ...
- SpringMVC日志管理(自定义异常及自定义注解)
近期为了规范公司老旧项目的日志,主要也是为了便于日后错误排查以及加强对业务系统的监控,准备对原有的日志输出进行简单的改造. 解决思路 1.通过自定义异常来将可能出现的问题分为两大类,业务类及系统类.同 ...
- 命令行创建2003的IP安全策略
IP安全策略从win2k到2003都有的,图形界面的没什么好说的,如何在命令行下控制IPSec呢?win2k的方法在Do All in Cmd Shell有介绍.这里就拿win2003做例子吧,毕 ...