HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)
http://acm.hdu.edu.cn/showproblem.php?pid=4509
题目大意:
中文意义,应该能懂。
解题思路:
因为题目给的时间是一天24小时,而且还有分钟。为了解题方便,我们将小时换成分钟,那么一天24小时,总共有1440分钟。顾我就可以把一天里的任意HH:MM时间换成分钟。就这样一天的时间就变成[0,1440]区间了。
因为所给的活动最多是5*10^5,如果把活动的时间在线段[0,1440]都修改,那么时间的复杂度最坏是O(5*10^5*1440)。
(1)方法一:线段树-区间覆盖。
线段树参考的是《算法入门经典训练指南》刘汝佳 P199
线段树其中一个特性,区间修改。我们把[0,1440]看成一个区间,我们只需要把活动时间的在线段树中标记就行。因为线段树是区间,每次标记都是区间。所以时间复杂度最坏O(5*10^5*log(1440)),我们只要查询[0,1440]整个区间,统计被覆盖的时间ans,用1440-ans=最后的答案。
查询时间的复杂度最坏是整棵树的节点O(2*1440)。
所以总时间复杂度最坏是O(5*10^5*log(1440))+ O(2*1440)。
注意:线段树的真正区间[1,1440],叶子节点表示是1秒的时间。
(2)方法二:暴力技巧
这个方法是借鉴别人的。
为了好理解这个方法,我们先举个简单的例子。

我们假设区间是[0,8]。
输入的数据是:
3
1 4
3 5
6 7
求未覆盖的线段和的长度。答案是3。
具体方法是。当输入1 4时,将1出+1,表示1后面的区间被覆盖了1次,在4出-1,表示4后面的区间取消覆盖1次。 这样就表示了1 4区间被覆盖了。3 5和6 7也是同理。
怎么求那些区间没有覆盖了,我是从0开始到结束,看每个小区间是否被覆盖。用一个count记录,若count为零时,表示此节点没有被覆盖。
区间修改的时间复杂度是O(5*10^5*1),区间查询是整个区间时间复杂度是O(1440)
顾总时间复杂度是O(5*10^5*1)+O(1440)
AC代码:
线段树
#include<cstdio>
#include<cstring> #define MAXN 1441//时间最多是1440 bool stree[MAXN << ];//线段树 int L, R;//要覆盖的区间为[L,R]
void updata(int o, int lc, int rc){//区间覆盖
if(stree[o]) return ;//此区间被覆盖了
if(L <= lc && rc <= R){//区间[lc,rc]在被覆盖的范围
stree[o] = true;
return ;
}
int mid = (lc + rc) >> ;
if(L <= mid) updata(o * + , lc, mid);
if(mid < R) updata(o * + , mid + , rc);
} int ans;//统计被覆盖的时间和
void query(int o, int lc, int rc){
if(stree[o]){
ans += rc - lc + ;
return ;
} if(lc == rc) return ;//访问到叶子节点了 int mid = (lc + rc) >> ;
query(o * + , lc, mid);
query(o * + , mid + , rc);
} int main(){
int n, hh[], mm[];
while(~scanf("%d", &n)){ memset(stree, , sizeof(stree));
while(n--){
scanf("%d:%d %d:%d", &hh[], &mm[], &hh[], &mm[]);
mm[] += hh[] * + ;
mm[] += hh[] * ;
L = mm[]; R = mm[];
updata(, , );//区间修改
}
ans = ;
query(, , );//区间访问
printf("%d\n", - ans);
}
return ;
}
暴力技巧:
#include<cstdio>
#include<cstring> #define MAXN 1441 int time[MAXN]; int main(){
int n, hh[], mm[];
while(~scanf("%d", &n)){ memset(time, , sizeof(time));
while(n--){
scanf("%d:%d %d:%d", &hh[], &mm[], &hh[], &mm[]);
mm[] += hh[] * ;
mm[] += hh[] * ; ++time[mm[]]; --time[mm[]];
} int ans = , count = ;
for(int i = ; i < ; ++i){
count += time[i];
if(count == ) ++ans;
}
printf("%d\n", ans);
}
return ;
}
HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)的更多相关文章
- 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记II ----线段树
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4509 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但 ...
- HDUOJ----4509湫湫系列故事——减肥记II
湫湫系列故事——减肥记II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- D - 湫湫系列故事——减肥记II
虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了? 湫 ...
- HDU 4509 湫湫系列故事——减肥记II(暴力模拟即可)
看了题目后,没自己做,直接看别人题解了,这里转一下. 看了之后,突然想起scanf还可以按照自己写的格式输入数据啊,差点连这个都忘记了啊. 注意输入中时间可能有重复的. http://www.cnbl ...
- HDU 4509 湫湫系列故事——减肥记II (简单模拟)
题意:一天一共有1440分钟,主人公每天有n件事要做,给出这n件事开始跟结束的时间,然后让你求出,空闲的时间的总分钟数是多少. 解题报告:简单模拟,只要开个一维数组标记那个每个分钟是否是有事的就可以了 ...
- HDOJ 4509 湫湫系列故事——减肥记II(2013腾讯编程马拉松) 并查集合并区间
发现这种合并区间的题目还可以这么玩 给你n段时间 然后问没被占用的时间是多少 题目所给的区间是右开的导致我wa 好多人5e5*1440的暴力跑出来的时间居然只是我的两倍 不懂.... 所以并查集并没有 ...
- 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)
湫湫系列故事――减肥记I HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...
- HDU 4508 湫湫系列故事——减肥记I(全然背包)
HDU 4508 湫湫系列故事--减肥记I(全然背包) http://acm.hdu.edu.cn/showproblem.php?pid=4508 题意: 有n种食物, 每种食物吃了能获得val[i ...
- HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)
HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...
随机推荐
- R实现灰色预测
1.简介 预测就是借助于对过去的探讨去推测.了解未来.灰色预测通过原始数据的处理和灰色模型的建立,发现.掌握系统发展规律,对系统的未来状态做出科学的定量预测.对于一个具体的问题,究竟选择什么样的预测模 ...
- EXCEL处理大量数据的潜在风险
同事收到几份60几M的xls文件,电脑性能不够,发给我来处理. 处理发现有BUG.简单的vlookup,如果只是实验性的处理几个数据的话,发现没有问题,但批量对全部数据进行处理,就会出现#N/A的问题 ...
- Leetcode N-Queens II
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- WordPress 的 Google 字体问题解决办法
在国内访问的时候,WordPress 里面引用的 google 字体可能会导致加载速度变得很慢. 要修改的地方有(我使用的版本是 4.0): wp-includes 里面的 script-loader ...
- UUID
首先我们要知道UUID是什么?有什么用?为什么要使用它? UUID是什么? UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定.如此一来,每个 ...
- 1.javascript篇(基础)
js基础部分 js定义: 1.js是通过浏览器解析,然后由浏览器执行的一种脚本语言2.css控制样式,而js控制行为 基本格式: <script type="text/javascri ...
- defer 和 async 本地对象和宿主对象
<script async></script> 没有defer和async的情况下是"同步执行"的,浏览器解析到这里的时候,会先加载资源完成后立即执行,并阻 ...
- 多线程相关------互斥量Mutex
互斥量(Mutex) 互斥量是一个可以处于两态之一的变量:解锁和加锁.只有拥有互斥对象的线程才具有访问资源的权限.并且互斥量可以用于不同进程中的线程的互斥访问. 相关函数: CreateMutex用于 ...
- PHP 天巡机票接口
一个旅游网站项目,网站需要机票预订接入了天巡机票接口,获取机票信息,不搞不知道,一搞吓一跳比较麻烦. 搜索机票信息需要分2步,首先POST获得一个SESSION,2秒之后,根据这个SESSION,从一 ...
- mysql performance_schema 和information_schema.tables了解
这个是关于mysql的系统表,性能表,核心表操作的一些介绍,深入算不上 我们一般很少去动 mysql information_schema 信息相关 performance_schema 性能相关 ...