小小粉丝度度熊 二分答案 + two pointer
http://acm.hdu.edu.cn/showproblem.php?pid=6119
发现自己的two pointer能力超弱。
这题是合并时间后,二分答案。
可以知道对于每个时间区间,合法的答案肯定是从其开始时间,向左扩展
或者从其结束时间,向右扩展。
复杂度O(2n log val)
细节有点恶心
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = + ;
struct Node {
int be, en;
bool operator < (const struct Node & rhs) const {
if (be != rhs.be) return be < rhs.be;
else return en < rhs.en;
}
}node[maxn];
int m, n;
LL sum[maxn];
bool check(LL val) {
int p1 = , p2 = ;
while (p1 <= n) {
while (p2 <= n && node[p2].en - node[p1].be + < val) {
p2++;
}
if (p2 == n + ) {
LL cut = sum[n] - sum[p1];
cut += node[p1].be + val - - node[n].en;
if (cut <= m) return true;
p1++;
continue;
}
// if (node[p2].en - node[p1].be + 1 < val) break;
if (node[p2].be - node[p1].be + > val) {
if (sum[p2 - ] - sum[p1] + node[p1].be + val - - node[p2 - ].en <= m) return true;
} else {
if (sum[p2] - sum[p1] <= m) return true;
}
p1++;
}
p1 = p2 = ;
while (p2 <= n && node[p2].en < val) p2++;
while (p2 <= n) {
while (p1 <= n && node[p2].en - node[p1].en + > val) {
p1++;
}
if (node[p2].en - node[p1].be + >= val) {
if (sum[p2] - sum[p1] <= m) return true;
} else {
LL cut = sum[p2] - sum[p1];
LL to = node[p2].en - val + ;
cut += node[p1].be - to;
if (cut <= m) return true;
}
p2++;
}
return false;
}
void work() {
for (int i = ; i <= n; ++i) {
scanf("%d%d", &node[i].be, &node[i].en);
}
sort(node + , node + + n);
int len = ;
for (int i = ; i <= n; ++i) {
if (node[len].en >= node[i].be) node[len].en = max(node[len].en, node[i].en);
else {
node[++len] = node[i];
}
}
n = len;
for (int i = ; i <= n; ++i) {
sum[i] = sum[i - ] + node[i].be - node[i - ].en - ;
}
LL be = , en = 1e15;
for (int i = ; i <= n; ++i) {
be = max(be, 1LL * node[i].en - node[i].be + );
}
while (be <= en) {
LL mid = (be + en) >> ;
if (check(mid)) be = mid + ;
else en = mid - ;
}
cout << en << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
while (scanf("%d%d", &n, &m) > ) work();
return ;
}
小小粉丝度度熊 二分答案 + two pointer的更多相关文章
- 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 小小粉丝度度熊 【预处理+尺取法】(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张补 ...
- 2017"百度之星"程序设计大赛 - 初赛(B)小小粉丝度度熊
Problem Description 度度熊喜欢着喵哈哈村的大明星——星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要 ...
- 【二分+尺取】HDU 6119 小小粉丝度度熊
http://acm.hdu.edu.cn/showproblem.php?pid=6119 [思路] 首先通过处理交叉的可以处理成不交叉的 然后二分查找答案 如何判断一个长度是否可行? 双指针O(n ...
- HDU 6119 小小粉丝度度熊(Two pointers)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6119 [题目大意] 给出一些签到区间和一些补签卡,问可以创造的最长连续签到区间 [题解] 如果我们 ...
- 百度之星2017初赛B1006 小小粉丝度度熊
思路: 考虑到补签卡一定是连续放置才更优,所以直接根据起始位置枚举.预先处理区间之间的gap的前缀和,在枚举过程中二分即可.复杂度O(nlog(n)). 实现: #include <iostre ...
随机推荐
- 51nod 1967 路径定向——欧拉回路
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 一共只会有偶数个奇数度的点.因为每多一条边,总度数加2. 把 ...
- Sublime Text 全程指南(转载)
摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最优秀的Sublime Text中文教程. 更新记录 2014/09/27:完成初稿 2014/09/28: 更正打开控 ...
- C语言中clock函数的使用
#include<cstdio> #include<cstdlib> #include<ctime> using namespace std; int main() ...
- java代码Math.sqrt
总结:这个判断小数的题目,当时全只2有一个人想出了结果.老师很开心.我很桑心~~~~ 我没想到要取膜,我只想到了除以等于0就够了.至于中间的“取膜”,我没凑齐来,还是不够灵活 package com. ...
- sql 根据年份、月份查询数据
CREATE TABLE [dbo].[T_UserAccess]( ,) NOT NULL, [UserId] [int] NULL, [UserType] [int] NULL, ) NULL, ...
- shell入门-cut命令
命令:cut 选项:-d:-f 指定第几段由“:(分割符)”分割的段 -c 指定第几个字符 说明:选取命令,选取一段数据中我们想要的,一般是针对每行来分析选取的 [root@wangshaoj ...
- 使用struts2进行文件下载以及下载权限控制的例子
本测试有两个模块,一个是文件上上传,一个是文件下载,文件下载的时候会检查是否足有权限,如果没有,就会转发到登录页面,如果有权限,就会直接启动下载程序,给浏览器一个输出流. 下面直接上我的代码: 登录表 ...
- 树莓派 Learning 002 装机后的必要操作 --- 02 解决中文问题
树莓派 装机后的必要操作 - 解决中文问题 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 每一块树莓派,装机后都应该执行的步骤 刚装机后, ...
- lsnrctl start错误Linux Error: 29: Illegal seek (翻译:非法谋取)
现在,想不起来为什么ORACLE的监听,怎么就突然无法起来了呢. 好吧,问题反正就是发生了. lsnrctl start 遇到如下错误, LSNRCTL for Linux: Version 10.2 ...
- git中避免提交.DS_Store文件[转载]
1. 先删除原有的.DS_Store: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch 命令解释:在当前文件夹 ...