http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1335

1335: 高桥和低桥

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”。举例说明:

假定高桥和低桥的高度分别是5和2,初始水位为1

第一次洪水:水位提高到6(两个桥都被淹),退到2(高桥不再被淹,但低桥仍然被淹)

第二次洪水:水位提高到8(高桥又被淹了),退到3。

没错,文字游戏。关键在于“又”的含义。如果某次洪水退去之后一座桥仍然被淹(即水位不小于桥的高度),那么下次洪水来临水位提高时不能算“又”淹一次。

输入n座桥的高度以及第i次洪水的涨水水位ai和退水水位bi,统计有多少座桥至少被淹了k次。初始水位为1,且每次洪水的涨水水位一定大于上次洪水的退水水位。

Input

输入文件最多包含25组测试数据。每组数据第一行为三个整数n, m, k(1<=n,m,k<=105)。第二行为n个整数hi(2<=hi<=108),即各个桥的高度。以下m行每行包含两个整数ai和bi(1<=bi<ai<=108, ai>bi-1)。输入文件不超过5MB。

Output

对于每组数据,输出至少被淹k次的桥的个数。

Sample Input

  1. 2 2 2
  2. 2 5
  3. 6 2
  4. 8 3
  5. 5 3 2
  6. 2 3 4 5 6
  7. 5 3
  8. 4 2
  9. 5 2

Sample Output

  1. Case 1: 1
  2. Case 2: 3

HINT

分析:

数据比较大,更新 + 查找 + 遍历 时间复杂度很高,会有超时,所以想到用树状数组来存储,用lowbit()查找 更新。

AC代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. using namespace std;
  6. const int N = 1e5+;
  7. int c[N],m,n,k,a[N];
  8. int x[N],y[N];
  9. int lowbit(int k)
  10. {
  11. return k&(-k);
  12. }
  13. void add(int k,int he)//每一项增加一个值
  14. {
  15. while(k>)
  16. {
  17. c[k]+=he;
  18. k-=lowbit(k);
  19. }
  20. }
  21. int search(int x)
  22. {
  23. int tmp=x;
  24. int l=;
  25. int r=n;
  26. int mid;
  27. while(l<r)
  28. {
  29. //printf("%d %d\n",l,r);
  30. mid=((l+r)>>);
  31. if(a[mid]>=tmp) r=mid;
  32. else l=mid+;
  33. }
  34. return r;
  35. }
  36. int Q(int k)
  37. {
  38. int query=;
  39. while(k<=n)
  40. {
  41. query+=c[k];
  42. k+=lowbit(k);
  43. }
  44. return query;
  45. }
  46. int main()
  47. {
  48. int t,from,to,he,kkk=;
  49. while(~scanf("%d%d%d",&n,&m,&k))
  50. {
  51. memset(c,,sizeof(c));
  52. for(int i=;i<=n;i++)
  53. scanf("%d",&a[i]);
  54. sort(a+,a+n+);
  55. for(int i=;i<=m;i++)
  56. {
  57. scanf("%d %d",&x[i],&y[i]);
  58. if(i == )
  59. {
  60. from = i;
  61. to = search(x[i]);
  62. }
  63. else
  64. {
  65. from = search(y[i-]);
  66. to = search(x[i]);
  67. }
  68. add(from,-);
  69. add(to,);
  70. }
  71. int ans = ;
  72. for(int i=;i<=n;i++)
  73. {
  74. int kk =Q(i);
  75. if(kk>=k)
  76. ans = ans+;
  77. }
  78. printf("Case %d: %d\n",kkk++,ans);
  79. }
  80. return ;
  81. }

还可以用lower_bound()解决。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. int h[];
  7. int f[];
  8.  
  9. int main() {
  10. int n,m,k,kase = ;
  11. while(~scanf("%d %d %d",&n,&m,&k)) {
  12. memset(f,,sizeof(f));
  13.  
  14. for(int i = ;i < n;i++) {
  15. scanf("%d",&h[i]);
  16. }
  17.  
  18. sort(h,h+n);
  19.  
  20. int s = ,t;
  21. int up,dwn;
  22. for(int i = ;i < m;i++) {
  23. scanf("%d %d",&up,&dwn);
  24. int lft = lower_bound(h,h+n,s+) - h;
  25. int rit = lower_bound(h,h+n,up+) - h;
  26. s = dwn;
  27. f[lft]++;
  28. f[rit]--;
  29. //printf("---\n");
  30. }
  31.  
  32. int ss = ,res = ;
  33. //printf("------\n");
  34. for(int i = ;i < n;i++) {
  35. ss += f[i];
  36. if(ss >= k) res++;
  37. //printf("2---\n");
  38. }
  39. printf("Case %d: %d\n",kase++,res);
  40. }
  41. return ;
  42. }

csuoj 1335: 高桥和低桥的更多相关文章

  1. CSU 1335: 高桥和低桥 (二分查找,树状数组)

    Description 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不 ...

  2. 【扫描线或树状数组】CSU 1335 高桥和低桥

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1335 [题意] 给定n座桥的高度,给定m次洪水每次的涨水水位ai和退水水位bi 询问有多少座桥 ...

  3. CSU 1335 高桥和低桥

    开始队友说是线段树,看了看貌似也是,上手敲了个嵌套的线段树,O(nlognlogn)的复杂度果断tle了 TAT 思路:对h[i]排序,对每次涨水退水,先用二分查找,再用一个数组保存当前点之后所有点被 ...

  4. H - 高桥和低桥

    H - 高桥和低桥 Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit Sta ...

  5. TZOJ 4602 高桥和低桥(二分或树状数组+二分)

    描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...

  6. UVA 12663 第九届省赛 高桥与低桥 线段树

    题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...

  7. 科普TPF知识

    https://tieba.baidu.com/p/4926092734?see_lz=1&pn=1 707680700 https://tieba.baidu.com/p/492609273 ...

  8. 对GBK的理解(内附全部字符编码列表):扩充的2万汉字低字节的高位不等于1,而且还剩许多编码空间没有利用

    各种编码查询表:http://bm.kdd.cc/ 由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱 ...

  9. Tarjan算法:求解图的割点与桥(割边)

    简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...

随机推荐

  1. oracle utf8字符集转gbk(转)

    近日有同事在外面部署系统时,安装数据库时可能选择了UTF-8编码格式,导入insert语句时,一个汉字被认为三个字节,这是不行的. 结合上网搜到的资料,将oracle数据库的编码格式,从utf-8改为 ...

  2. ubuntu12.04 安装 php5.4/php5.5

    1:修改源(我使用163的源)直接修改/etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ precise main universe re ...

  3. Bootstrap 输入框和导航组件

    一.输入框组件 //在左侧添加文字 <div class="input-group"> <span class="input-group-addon&q ...

  4. self.nsme 和 _name 的问题

    .h文件 @interface myclass:NSObject @property(nonatomic,retain)NSArray*MyArray; @end .m文件 @implementati ...

  5. JQuery直接调用asp.net后台WebMethod方法

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法.[WebMethod]   命名空间 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod]的 ...

  6. swift-03-构造器(Designated&&Convenience)

    类里面所有的存储型属性--包括所有继承自父类的属性,都必须在构造过程中设置初始值.   构造器,为了确保所有类实例中的存储型属性都能获得初始值,设置了两个构造器--他们分别是指定构造器和便利构造器. ...

  7. js保留n位小数

    1.功能:将浮点数四舍五入,取小数点后2位 function toDecimal(num) { var f = parseFloat(num); if (isNaN(f)) { return; } f ...

  8. C# RichTextBox 滚动条 滚动到最后一行

    使用RichTextBox控件用于显示数据时,滚动条只停留在开头,而我希望能够一直更新,显示最后一行的内容.解决方法记录于此. 转载自以下链接: http://blog.csdn.net/xelone ...

  9. iOS GCD简单使用

    Grand Central Dispatch (GCD) 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*!* @function dispatc ...

  10. thinkphp 最简单的引入百度编辑器的方法

    后台肯定是框架了...编辑器放在框架里面... 后台首页比如是这样的... <html> <frameset cols="10%,90%"> <fra ...