小小粉丝度度熊 二分答案 + 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. 把 ...
- 自定义type为file型input控件+该控件具有本地图片预览功能
最近的一个项目需求是写一个type为filex型的input控件,这个控件: 第一,要自定义样式: 第二,要能直接在本地预览上传的图片: 第三,要能检测图片的尺寸是否符合要求. 故综合网上的资源写了下 ...
- MySQL Explain详解(转)
explain SELECT a.* FROM test a,(select id from test where level_id <=4 order by aa_id limit 24300 ...
- 使用svnadmin对VisualSVN进行项目迁移
使用svnadmin对VisualSVN进行项目迁移 导出1> 启动命令行cmd2> 运行%VISUALSVN_SERVER%\bin\svnadmin dump PATH-TO-REPO ...
- 七 内置锁 wait notify notifyall; 显示锁 ReentrantLock
Object中对内置锁进行操作的一些方法: Java内置锁通过synchronized关键字使用,使用其修饰方法或者代码块,就能保证方法或者代码块以同步方式执行. 内置锁使用起来非常方便,不需要显式的 ...
- delphi 线程教学第一节:初识多线程
第一节:初识多线程 1.为什么要学习多线程编程? 多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...
- CentOS 7 配置 mariadb
一.安装mariadb : yum groupinstall mariadb mariadb-client -y 二.启动(设置开机启动)服务 : systemctl start (enabl ...
- Leetcode:1. Two Sum
public class TwoSum1 { public static void main(String[] args) { int[] nums = new int[]{2, 7, 11, 15} ...
- 哪个U盘启动工具能安装红帽系统,
安装红帽子,不要使用windows系统下的PE启动盘,两者引导方式不一样,不通用的.正确的方法是网上下载红帽子的ISO镜像文件后,用UltraISO这个工具写入优盘或者光盘,得到的系统盘才可以启动电脑 ...
- doxygen+ graphviz 开源工具生成源码调用树的wiki
当拿到一含有大量代码的工程怎么看?!这时一个好的代码分析工具非常有用,网上有很多开源工具,但资料都参差不齐,偶然发现doxygen+ graphviz这两工具非常棒,使用工具直接生成函数调用链图,帮助 ...