题意:

      x轴上有一些矩形,问你这些矩形覆盖的面积和是多少。

思路:

      首先范围很大,n很小,果断离散化,然后我们就是求出任意区间的最大值作为当前区间的高,最后在算一遍答案就行了,一开始超时了,离散化的时候用map了,后来改成二分就ac了,感觉题目不是很难,明天得开始学习学习扫描线了,还不知道什么是扫描线呢。


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #define lson l ,mid ,t << 1
  5. #define rson mid + 1 ,r ,t << 1 | 1
  6. using namespace std;
  7. typedef struct
  8. {
  9. __int64 a ,b ,c;
  10. }EDGE;
  11. EDGE edge[44000];
  12. __int64 Max[330000];
  13. __int64 mark[330000];
  14. __int64 tmp[88000];
  15. __int64 num[88000];
  16. __int64 hash[880000];
  17. __int64 maxx(__int64 x ,__int64 y)
  18. {
  19. return x > y ? x : y;
  20. }
  21. void Pushup(__int64 t)
  22. {
  23. Max[t] = maxx(Max[t<<1] ,Max[t<<1|1]);
  24. }
  25. void Pushdown(__int64 t)
  26. {
  27. if(mark[t])
  28. {
  29. mark[t<<1] = maxx(mark[t<<1] ,mark[t]);
  30. mark[t<<1|1] = maxx(mark[t<<1|1] ,mark[t]);
  31. Max[t<<1] = maxx(Max[t<<1] ,mark[t]);
  32. Max[t<<1|1] = maxx(Max[t<<1|1] ,mark[t]);
  33. mark[t] = 0;
  34. }
  35. }
  36. void BuidTree()
  37. {
  38. memset(Max ,0 ,sizeof(Max));
  39. memset(mark ,0 ,sizeof(mark));
  40. }
  41. void Update(__int64 l ,__int64 r ,__int64 t ,__int64 a ,__int64 b ,__int64 c)
  42. {
  43. if(a <= l && b >= r)
  44. {
  45. Max[t] = maxx(Max[t] ,c);
  46. mark[t] = maxx(mark[t] ,c);
  47. return;
  48. }
  49. Pushdown(t);
  50. __int64 mid = (l + r) >> 1;
  51. if(a <= mid) Update(lson ,a ,b ,c);
  52. if(b > mid) Update(rson ,a ,b ,c);
  53. Pushup(t);
  54. }
  55. __int64 Query(__int64 l ,__int64 r ,__int64 t ,__int64 a)
  56. {
  57. if(l == r) return Max[t];
  58. Pushdown(t);
  59. __int64 mid = (l + r) >> 1;
  60. if(a <= mid) return Query(lson ,a);
  61. else return Query(rson ,a);
  62. }
  63. __int64 search2(__int64 n ,__int64 now)
  64. {
  65. __int64 low ,up ,mid ,ans;
  66. low = 1 ,up = n;
  67. while(low <= up)
  68. {
  69. mid = (low + up) >> 1;
  70. if(now <= num[mid])
  71. {
  72. ans = mid;
  73. up = mid - 1;
  74. }
  75. else low = mid + 1;
  76. }
  77. return ans;
  78. }
  79. int main ()
  80. {
  81. __int64 n ,i;
  82. while(~scanf("%I64d" ,&n))
  83. {
  84. __int64 id = 0;
  85. for(i = 1 ;i <= n ;i ++)
  86. {
  87. scanf("%I64d %I64d %I64d" ,&edge[i].a ,&edge[i].b ,&edge[i].c);
  88. tmp[++id] = edge[i].a;
  89. tmp[++id] = edge[i].b;
  90. }
  91. sort(tmp + 1 ,tmp + id + 1);
  92. tmp[0] = -1;
  93. for(id = 0 ,i = 1 ;i <= n * 2 ;i ++)
  94. {
  95. if(tmp[i] == tmp[i-1]) continue;
  96. num[++id] = tmp[i];
  97. }
  98. BuidTree();
  99. for(i = 1 ;i <= n ;i ++)
  100. {
  101. __int64 a = search2(id ,edge[i].a);
  102. __int64 b = search2(id ,edge[i].b);
  103. Update(1 ,id ,1 ,a + 1 ,b ,edge[i].c);
  104. }
  105. __int64 ans = 0;
  106. for(i = 2 ;i <= id ;i ++)
  107. {
  108. __int64 now = Query(1 ,id ,1 ,i);
  109. now = (num[i] - num[i-1]) * now;
  110. ans += now;
  111. }
  112. printf("%I64d\n" ,ans);
  113. }
  114. return 0;
  115. }

POJ3277 线段树段更新,点询问+二分离散化+暴力的更多相关文章

  1. UVA11992不错的线段树段更新

    题意:       给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v  把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v  把子矩阵的值全部都变成v 2 x ...

  2. hdu1556 线段树段更新(简单题)

    题意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个 ...

  3. hdu4267线段树段更新,点查找,55棵线段树.

    题意:      给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新. 思路: ...

  4. poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 43507   Accepted: 12693 ...

  5. POJ2528线段树段更新逆序异或(广告牌)

    题意:      可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的. 思路:      一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目 ...

  6. 线段树区间更新,区间统计+离散化 POJ 2528 Mayor&#39;s posters

    题意:有一个非常长的板子(10000000长),在上面贴n(n<=10000)张海报.问最后从外面能看到几张不同的海报. 由于板子有10000000长,直接建树肯定会爆,所以须要离散化处理,对于 ...

  7. hdu6070(分数规划/二分+线段树区间更新,区间最值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 给出一个题目提交序列, 从中选出一个正确率最小的子串. 选中的子串中每个题目当且仅当最 ...

  8. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. UESTC 1591 An easy problem A【线段树点更新裸题】

    An easy problem A Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others ...

随机推荐

  1. PAT-1150(Travelling Salesman Problem)旅行商问题简化+模拟图+简单回路判断

    Travelling Salesman Problem PAT-1150 #include<iostream> #include<cstring> #include<st ...

  2. 02----python入门----基本数据类型

    关于数据分类依据 一.数字型(int) Python可以处理任意大小的正负整数,但是实际中跟我们计算机的内存有关,在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,在64位系 ...

  3. spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析

    知识点梳理 课堂讲义 1)事务回顾 1.1)什么是事务-视频01 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2)事务的作用 事务特征(ACID) 原子 ...

  4. Java中的四种权限修饰符及六种非访问修饰符(简识)

    一.是哪四种访问权限修饰符呢? public > protected > [default] > private (公共的 ) (受保护的) (默认的) (私有的) 二.简单认识四种 ...

  5. CMU15-455 Lab2 - task4 Concurrency Index -并发B+树索引算法的实现

    最近在做 CMU-15-445 Database System,lab2 是需要完成一个支持并发操作的B+树,最后一部分的 Task4 是完成并发的索引这里对这部分加锁的思路和完成做一个总结,关于 B ...

  6. winnt.h

    winnt.h https://docs.microsoft.com/en-us/windows/win32/api/winnt/ /*++ BUILD Version: 0091 Increment ...

  7. python3 中is和==的区别

    is    身份运算符,用来判断对象是否属于同一地址 (python内置函数id() 可以返回对象地址) ==  比较运算符,用于判断值是否相同

  8. 菜刀jsp小马

    逛google收获小马一枚,收藏一下 <%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*&q ...

  9. 等不及要告诉你的一件事-console.log可以指定样式

    今天看`简书`文章,习惯性的打开了开发者工具,于是发现了意见有意思的事,在console面板,发现了如下的日志: ??? 这 ... 有点意思. 如果上面的图片,不能引起你的兴趣,那么你可以再看看这个 ...

  10. PE学习前的一些小知识

    位移运算 1.与运算 & 2.或运算 | 3.非运算 ~ 4.异或运算 ^ 5.移位运算 <<  >> 内存分配,文件读写 宏定义说明 一.无参数的宏定义的一般形式为: ...