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代码:

线段树

  1. #include<cstdio>
  2. #include<cstring>
  3.  
  4. #define MAXN 1441//时间最多是1440
  5.  
  6. bool stree[MAXN << ];//线段树
  7.  
  8. int L, R;//要覆盖的区间为[L,R]
  9. void updata(int o, int lc, int rc){//区间覆盖
  10. if(stree[o]) return ;//此区间被覆盖了
  11. if(L <= lc && rc <= R){//区间[lc,rc]在被覆盖的范围
  12. stree[o] = true;
  13. return ;
  14. }
  15. int mid = (lc + rc) >> ;
  16. if(L <= mid) updata(o * + , lc, mid);
  17. if(mid < R) updata(o * + , mid + , rc);
  18. }
  19.  
  20. int ans;//统计被覆盖的时间和
  21. void query(int o, int lc, int rc){
  22. if(stree[o]){
  23. ans += rc - lc + ;
  24. return ;
  25. }
  26.  
  27. if(lc == rc) return ;//访问到叶子节点了
  28.  
  29. int mid = (lc + rc) >> ;
  30. query(o * + , lc, mid);
  31. query(o * + , mid + , rc);
  32. }
  33.  
  34. int main(){
  35. int n, hh[], mm[];
  36. while(~scanf("%d", &n)){
  37.  
  38. memset(stree, , sizeof(stree));
  39. while(n--){
  40. scanf("%d:%d %d:%d", &hh[], &mm[], &hh[], &mm[]);
  41. mm[] += hh[] * + ;
  42. mm[] += hh[] * ;
  43. L = mm[]; R = mm[];
  44. updata(, , );//区间修改
  45. }
  46. ans = ;
  47. query(, , );//区间访问
  48. printf("%d\n", - ans);
  49. }
  50. return ;
  51. }

暴力技巧:

  1. #include<cstdio>
  2. #include<cstring>
  3.  
  4. #define MAXN 1441
  5.  
  6. int time[MAXN];
  7.  
  8. int main(){
  9. int n, hh[], mm[];
  10. while(~scanf("%d", &n)){
  11.  
  12. memset(time, , sizeof(time));
  13. while(n--){
  14. scanf("%d:%d %d:%d", &hh[], &mm[], &hh[], &mm[]);
  15. mm[] += hh[] * ;
  16. mm[] += hh[] * ;
  17.  
  18. ++time[mm[]]; --time[mm[]];
  19. }
  20.  
  21. int ans = , count = ;
  22. for(int i = ; i < ; ++i){
  23. count += time[i];
  24. if(count == ) ++ans;
  25. }
  26. printf("%d\n", ans);
  27. }
  28. return ;
  29. }

HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)的更多相关文章

  1. 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记II ----线段树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4509 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但 ...

  2. HDUOJ----4509湫湫系列故事——减肥记II

    湫湫系列故事——减肥记II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  3. D - 湫湫系列故事——减肥记II

    虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了? 湫 ...

  4. HDU 4509 湫湫系列故事——减肥记II(暴力模拟即可)

    看了题目后,没自己做,直接看别人题解了,这里转一下. 看了之后,突然想起scanf还可以按照自己写的格式输入数据啊,差点连这个都忘记了啊. 注意输入中时间可能有重复的. http://www.cnbl ...

  5. HDU 4509 湫湫系列故事——减肥记II (简单模拟)

    题意:一天一共有1440分钟,主人公每天有n件事要做,给出这n件事开始跟结束的时间,然后让你求出,空闲的时间的总分钟数是多少. 解题报告:简单模拟,只要开个一维数组标记那个每个分钟是否是有事的就可以了 ...

  6. HDOJ 4509 湫湫系列故事——减肥记II(2013腾讯编程马拉松) 并查集合并区间

    发现这种合并区间的题目还可以这么玩 给你n段时间 然后问没被占用的时间是多少 题目所给的区间是右开的导致我wa 好多人5e5*1440的暴力跑出来的时间居然只是我的两倍 不懂.... 所以并查集并没有 ...

  7. 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)

    湫湫系列故事――减肥记I  HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...

  8. HDU 4508 湫湫系列故事——减肥记I(全然背包)

    HDU 4508 湫湫系列故事--减肥记I(全然背包) http://acm.hdu.edu.cn/showproblem.php?pid=4508 题意: 有n种食物, 每种食物吃了能获得val[i ...

  9. HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)

    HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...

随机推荐

  1. nodejs review-03

    39 Serve different file types with our server 处理文件类型 function content_type(filename) { var ext = pat ...

  2. 图形化查看maven的dependency依赖

    开发项目的时候,我们想知道一个maven的依赖库是来自那个工程,eclipse有插件可以直接看Dependency Hierarchy,推荐一个第三方的工具yED 在工程的pom.xml文件中添加如下 ...

  3. jvm的垃圾回收原理

    什么是垃圾回收? 垃圾回收是Java中自动内存管理的另一种叫法.垃圾回收的目的是为程序保持尽可能多的可用堆(heap). JVM会删除堆上不再需要从堆引用的对象. 用一个例子解释垃圾回收? 比方说,下 ...

  4. 玩转GIT

    远程代码覆盖本地 解决方法: 1.如果还没有 commit 的话,可以用 git checkout . 这样将使所有代码还原到最后一次 commit 的状态 2.如果已经 commit 了,最简单的方 ...

  5. Hbase0.96 MVCC Lock 知识梳理

    HBASE0.96 MVCC 写入的时候 每个Region包含一个Memstore,维护一个MultiVersionConsistencyControl对象 w = mvcc.beginMemstor ...

  6. 如何打开VPK文件?里面究竟有什么?

    在DOTA2游戏目录下有一类VPK文件,如何打开VPK文件? 下载http://nemesis.thewavelength.net/index.php?p=26,安装完成后即可打开. 打开dota 2 ...

  7. Django分析之导出为PDF文件

    最近在公司一直忙着做exe安装包,以及为程序添加新功能,好久没有继续来写关于Django的东西了….难得这个周末清闲,来了解了解Django的一些小功能也是极好的了~ 那今天就来看看在Django的视 ...

  8. .net c# 服务器共享文件夹 windows远程登陆 代码

    一个刚刚开始学习编程的人,如果遇到问题无法解决可能会寻找别的解决方案,如果长此以往可能会放弃这门语言而学习其他的语言... 开源与分享的重要性 使用场景:将网站所有附件上传到指定服务器的共享目录下,首 ...

  9. BZOJ 2761: [JLOI2011]不重复数字 水题

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2100  Solved: 809 题目连接 http:// ...

  10. *HDU3038 并查集

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...