hdu 6119 小小粉丝度度熊
小小粉丝度度熊
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1299 Accepted Submission(s):
419
为什么度度熊会喜欢星星小姐呢?
首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听。
但这都不是最重要的,最重要的是,星星小姐拍的一手好代码!
于是度度熊关注了星星小姐的贴吧。
一开始度度熊决定每天都在星星小姐的贴吧里面签到。
但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到。
不过度度熊并不是非常悲伤,因为他有m张补签卡,每一张补签卡可以使得某一忘签到的天,变成签到的状态。
那么问题来了,在使用最多m张补签卡的情况下,度度熊最多连续签到多少天呢?
第一行两个整数n,m,表示有n个区间,这n个区间内的天数,度度熊都签到了;m表示m张补签卡。
接下来n行,每行两个整数(l[i],r[i]),表示度度熊从第l[i]天到第r[i]天,都进行了签到操作。
数据范围:
1<=n<=100000
0<=m<=1000000000
0<=l[i]<=r[i]<=1000000000
注意,区间可能存在交叉的情况。
1 1
3 3
1 2
1 1
3
样例一:度度熊补签第2天,然后第1天、第二天和第三天都进行了签到操作。
样例二:度度熊补签第2天和第3天。
思路:尺取法,做法:例如下图所示,先把题设给出的那些区间预处理,合并有重叠的那些区间,处理后的区间互不重叠,区间编号可以从1开始计数,s为尺取法中取中的那些区间中最左边的那个区间的编号,t为最右边的区间的编号。若s的左端点直到t的右端点之间的空隙的和小于等于补签卡的个数,此时更新所求区间的最大长度,并且补签卡没用完,说明t点也许还可以往右延伸,以获得更大的区间长度,直到t尝试走完所有区间;若s,t之间的空隙的和大于补签卡个数,说明t走得太过远了,换句话说,若是以s为签到的第一个区间,用完m张签到卡,最多也只能走到(t-1)区间的后面一点点,不会到达t区间的左端点,此时也要更新区间的最大长度,并且让s往右挪一区间。

AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
const int N_MAX = +; struct Interval {
int Left, Right;
Interval(int Left=,int Right=):Left(Left),Right(Right) {}
bool operator <(const Interval&b) const{
if (this->Left != b.Left)return this->Left < b.Left;
else return this->Right < b.Right;
}
}interval[N_MAX];
vector<Interval>vec;
int n, m;
ll c[N_MAX];//c[j]记录到区间j为止(包括j)的所有区间和,不包含中间的空隙
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
vec.clear();
memset(c, , sizeof(c));
for (int i = ; i < n; i++) {
scanf("%d%d", &interval[i].Left, &interval[i].Right);
}
sort(interval, interval + n);
vec.push_back(interval[]);
for (int i = ; i < n; i++) {//合并所有可以合并的区间
Interval P = vec[vec.size() - ];
if (interval[i].Left <= P.Right + ) {//两个区间可以合并
int Left, Right;
Right = max(P.Right, interval[i].Right);
vec.pop_back();
Left = P.Left;
vec.push_back(Interval(Left, Right));
}
else {
vec.push_back(interval[i]);
}
}
int N = vec.size();//区间的数量 for (int i = ; i <= N;i++) {//c[i],第i个区间为止所有区间的大小的和
c[i] += c[i-] + vec[i-].Right - vec[i-].Left + ;
} int s = , t = ;
ll res = ;
ll num;
for (;;) {
while (t <= N&&(num=(vec[t-].Right-vec[s-].Left+-(c[t]-c[s-])) )<= m) {
ll diff = vec[t - ].Right - vec[s - ].Left + ;
res =max(res,diff);
t++;
}
if (num <= m) { break; }
ll remain = c[t-]-c[s-]+m ;
res = max(res, remain);
s++;
}
res = max(res, c[N ] - c[s - ] + m);
printf("%lld\n", res);
}
return ;
}
hdu 6119 小小粉丝度度熊的更多相关文章
- HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017"百度之星"程序设计大赛 - 初赛(B))
小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 6119 小小粉丝度度熊(尺取)
小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 6119 小小粉丝度度熊 (区间去重)【尺取】
<题目链接> 度度熊决定每天都在星星小姐的贴吧里面签到. 但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到. 不过度度熊并不是非常悲伤,因为他有m张补 ...
- HDU 6119 小小粉丝度度熊 双指针
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 题意:中文题面. 解法:先处理可能交叉的区间,然后容易发现满足双指针的特性. //HDU 611 ...
- HDU 6119 小小粉丝度度熊(Two pointers)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6119 [题目大意] 给出一些签到区间和一些补签卡,问可以创造的最长连续签到区间 [题解] 如果我们 ...
- 【二分+尺取】HDU 6119 小小粉丝度度熊
http://acm.hdu.edu.cn/showproblem.php?pid=6119 [思路] 首先通过处理交叉的可以处理成不交叉的 然后二分查找答案 如何判断一个长度是否可行? 双指针O(n ...
- HDU 6119 2017百度之星初赛B 小小粉丝度度熊 (二分)
小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 2017"百度之星"程序设计大赛 - 初赛(B)小小粉丝度度熊
Problem Description 度度熊喜欢着喵哈哈村的大明星——星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要 ...
- 小小粉丝度度熊 二分答案 + two pointer
http://acm.hdu.edu.cn/showproblem.php?pid=6119 发现自己的two pointer能力超弱. 这题是合并时间后,二分答案. 可以知道对于每个时间区间,合法的 ...
随机推荐
- javaweb基础(3)_tomcat下部署项目
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- 在Linux下安装redis
http://www.cnblogs.com/xiaohongxin/p/6854095.html 追加: 通过配置文件启动最好先./redis.cli shutdown ,再到当前目录在./redi ...
- UIViewController 的 edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets属性
1.有时你命名设置了某控件的y坐标为0,确总是被导航栏遮挡住,如下: UILabel *label = [[UILabel alloc] init]; label.text = @"请 ...
- JavaScript之基操
局部变量前面要加var 如 var name = "jiahuai" 全局变量 name = "jiahuai" 写完每一行JavaScript代码用;号隔 ...
- Golang 简单 http 代理转发
程序基本实现了对http的完整转发,目前暂不支持https windows需要在设置中的网络>代理设置为手动,并开启代理服务器,填写ip和端口 // httpForward package ma ...
- Ubuntu 16.04系统安装步骤
1.安装系统 2.设置更新源,自动检测最优更新源 3.关闭自动更新 4.设置终端样式 5.设置终端快捷键 6.安装vim,配置.vimrc 7.修改.bashrc第62行,小写w为大写W,设置终端不显 ...
- web开发框架tornado
在server.py文件中 import tornado.web import tornado.ioloop import tornado.httpserver import config from ...
- 像玩魔兽一样编程——谈VS2010键盘流
早年在学校里的时候,经常玩War3,那时候很痴迷,也经常看sky.moon的一些第一视角,有的时候也会模仿模仿...好吧,往事不堪回首,现在工作了,谈一谈.Net程序猿使用VS的键盘流,如果你不知道s ...
- while else语句
#else 用于检测循环中间是否有被打断count = 0while count <=5: print('loop',count) count +=1else: print('程序正常执行完毕, ...
- 由浅入深学习PBR的原理和实现
目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...