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的更多相关文章

  1. HDU 6119 2017百度之星初赛B 小小粉丝度度熊 (二分)

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. hdu 6119 小小粉丝度度熊

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017"百度之星"程序设计大赛 - 初赛(B))

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. hdu 6119 小小粉丝度度熊(尺取)

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  5. HDU 6119 小小粉丝度度熊 (区间去重)【尺取】

    <题目链接> 度度熊决定每天都在星星小姐的贴吧里面签到. 但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到. 不过度度熊并不是非常悲伤,因为他有m张补 ...

  6. 2017"百度之星"程序设计大赛 - 初赛(B)小小粉丝度度熊

    Problem Description 度度熊喜欢着喵哈哈村的大明星——星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要 ...

  7. 【二分+尺取】HDU 6119 小小粉丝度度熊

    http://acm.hdu.edu.cn/showproblem.php?pid=6119 [思路] 首先通过处理交叉的可以处理成不交叉的 然后二分查找答案 如何判断一个长度是否可行? 双指针O(n ...

  8. HDU 6119 小小粉丝度度熊(Two pointers)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6119 [题目大意] 给出一些签到区间和一些补签卡,问可以创造的最长连续签到区间 [题解] 如果我们 ...

  9. 百度之星2017初赛B1006 小小粉丝度度熊

    思路: 考虑到补签卡一定是连续放置才更优,所以直接根据起始位置枚举.预先处理区间之间的gap的前缀和,在枚举过程中二分即可.复杂度O(nlog(n)). 实现: #include <iostre ...

随机推荐

  1. 洛谷【P3952】NOIP2017提高组Day1T2时间复杂度

    我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P395 ...

  2. JS 获取json长度

    var keleyijson={"plug1":"myslider","plug2":"zonemenu"," ...

  3. Python:collections的deque()方法

    转于:https://www.cnblogs.com/zhenwei66/p/6598996.html 博主:http://www.cnblogs.com/zhenwei66/(渐晨) python3 ...

  4. HeartBleed bug

    前两年的一个严重漏洞,影响很大.出现在openssl 1.0.1和1.0.2 beta(包含1.0.1f和1.0.2beta1).利用了TLS的heartbeat. 简单的说,该漏洞被归为缓冲过度读取 ...

  5. js一个游戏小笔记

    昨天写了个飞机大战的游戏,没弄好的一点是如何移动炮台. 开始我把移动代码写到了炮台类里面,但是怎么按都不移动.(最烦,代码对,效果不对,╮(╯▽╰)╭) 问过老师才知道,这种移动类游戏,应该把  控制 ...

  6. word2010以上版本中快捷录入数学公式的方法(二)

    以前推荐的方法,随着方正飞翔网站上关闭了数学公式输入法的支持也不能不用了,现在再推荐一个可以在word2010以上版中快捷输入数学公式的方法,安装AxMath,一切问题都OK!我是直接购买的正版,25 ...

  7. shell解决DOS攻击生产案例

    解决DOS攻击生产案例企业实战题5:请用至少两种方法实现!写一个脚本解决DOS攻击生产案例.提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封 ...

  8. 关于startservice的几个启动返回值的意义

    START_NOT_STICKY 如果服务进程在它启动后(从onStartCommand()返回后)被kill掉, 并且没有新启动的intent传给他, 那么将服务移出启动状态并且不重新生成, 直到再 ...

  9. [poj2135]Farm Tour(最小费用流)

    解题关键:最小费用流 代码一:bellma-ford $O(FVE)$  bellman-ford求最短路,并在最短路上增广,速度较慢 #include<cstdio> #include& ...

  10. console (控制台)

    console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台. 该模块导出了两个特定的组件: 一个 Console 类,包含 console.log()  ...