小小粉丝度度熊 二分答案 + 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 ...
随机推荐
- 洛谷【P3952】NOIP2017提高组Day1T2时间复杂度
我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P395 ...
- JS 获取json长度
var keleyijson={"plug1":"myslider","plug2":"zonemenu"," ...
- Python:collections的deque()方法
转于:https://www.cnblogs.com/zhenwei66/p/6598996.html 博主:http://www.cnblogs.com/zhenwei66/(渐晨) python3 ...
- HeartBleed bug
前两年的一个严重漏洞,影响很大.出现在openssl 1.0.1和1.0.2 beta(包含1.0.1f和1.0.2beta1).利用了TLS的heartbeat. 简单的说,该漏洞被归为缓冲过度读取 ...
- js一个游戏小笔记
昨天写了个飞机大战的游戏,没弄好的一点是如何移动炮台. 开始我把移动代码写到了炮台类里面,但是怎么按都不移动.(最烦,代码对,效果不对,╮(╯▽╰)╭) 问过老师才知道,这种移动类游戏,应该把 控制 ...
- word2010以上版本中快捷录入数学公式的方法(二)
以前推荐的方法,随着方正飞翔网站上关闭了数学公式输入法的支持也不能不用了,现在再推荐一个可以在word2010以上版中快捷输入数学公式的方法,安装AxMath,一切问题都OK!我是直接购买的正版,25 ...
- shell解决DOS攻击生产案例
解决DOS攻击生产案例企业实战题5:请用至少两种方法实现!写一个脚本解决DOS攻击生产案例.提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封 ...
- 关于startservice的几个启动返回值的意义
START_NOT_STICKY 如果服务进程在它启动后(从onStartCommand()返回后)被kill掉, 并且没有新启动的intent传给他, 那么将服务移出启动状态并且不重新生成, 直到再 ...
- [poj2135]Farm Tour(最小费用流)
解题关键:最小费用流 代码一:bellma-ford $O(FVE)$ bellman-ford求最短路,并在最短路上增广,速度较慢 #include<cstdio> #include& ...
- console (控制台)
console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台. 该模块导出了两个特定的组件: 一个 Console 类,包含 console.log() ...