There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy ) means the wave is a rectangle whose vertexes are ( 00 , 00 ), ( xx , 00 ), ( 00 , yy ), ( xx , yy ). Every time the wave will wash out the trace of former wave in its range and remain its own trace of ( xx , 00 ) -> ( xx , yy ) and ( 00 , yy ) -> ( xx , yy ). Now the toad on the coast wants to know the total length of trace on the coast after n waves. It's guaranteed that a wave will not cover the other completely.

Input

The first line is the number of waves n(n \le 50000)n(n≤50000).

The next nn lines,each contains two numbers xx yy ,( 0 < x0<x , y \le 10000000y≤10000000 ),the ii-th line means the ii-th second there comes a wave of ( xx , yy ), it's guaranteed that when 1 \le i1≤i , j \le nj≤n ,x_i \le x_jxi​≤xj​ and y_i \le y_jyi​≤yj​ don't set up at the same time.

Output

An Integer stands for the answer.

Hint:

As for the sample input, the answer is 3+3+1+1+1+1=103+3+1+1+1+1=10

样例输入复制

  1. 3
  2. 1 4
  3. 4 1
  4. 3 3

样例输出复制

  1. 10

   第一眼扫描线 想想突然感觉不太对,扫描线不会写

    这题仔细分析一下 这题倒推更加容易写

    这题倒推的话只要更新比这个矩形更大的区域就行了

    离散化一下

    注意两个点

       int ny = query( 1, L[i], tot, 1 );
       int nx = query( 2, R[i], tot, 1 );

    因为他给的是一个矩形所以我们看这条边能不能算就是看这个点的左边的最大值 所以query (L[I]->tot)

    因为你只要左边有一条边 ,这是一个矩形 所以右边也一定有

    第二个点

      update( 1, L[i], sum[R[i] - 1], 1 );
      update( 2, R[i], sum[L[i] - 1], 1 );

    L[i] 表示X轴上的点 他的值对应的是  sum[R[i] - 1]

    

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <set>
  7. #include <iostream>
  8. #include <map>
  9. #include <stack>
  10. #include <string>
  11. #include <vector>
  12. #define pi acos(-1.0)
  13. #define eps 1e-6
  14. #define fi first
  15. #define se second
  16. #define lson l,m,rt<<1
  17. #define rson m+1,r,rt<<1|1
  18. #define rtl rt<<1
  19. #define rtr rt<<1|1
  20. #define bug printf("******\n")
  21. #define mem(a,b) memset(a,b,sizeof(a))
  22. #define name2str(x) #x
  23. #define fuck(x) cout<<#x" = "<<x<<endl
  24. #define f(a) a*a
  25. #define sf(n) scanf("%d", &n)
  26. #define sff(a,b) scanf("%d %d", &a, &b)
  27. #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
  28. #define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
  29. #define pf printf
  30. #define FRE(i,a,b) for(i = a; i <= b; i++)
  31. #define FREE(i,a,b) for(i = a; i >= b; i--)
  32. #define FRL(i,a,b) for(i = a; i < b; i++)
  33. #define FRLL(i,a,b) for(i = a; i > b; i--)
  34. #define FIN freopen("in.txt","r",stdin)
  35. #define gcd(a,b) __gcd(a,b)
  36. #define lowbit(x) x&-x
  37. using namespace std;
  38. typedef long long LL;
  39. typedef unsigned long long ULL;
  40. const int INF = 0x7fffffff;
  41. const int mod = 1e9 + ;
  42. const int maxn = 1e6 + ;
  43. struct node {
  44. int l, r, sumx, sumy;
  45. int mid() {
  46. return ( l + r ) >> ;
  47. }
  48. } tree[maxn << ];
  49. void build( int l, int r, int rt ) {
  50. tree[rt].l = l, tree[rt].r = r, tree[rt].sumx = tree[rt].sumy = ;
  51. if ( l == r ) return ;
  52. int m = ( l + r ) >> ;
  53. build( l, m, rtl );
  54. build( m + , r, rtr );
  55. }
  56. void update( int op, int pos, int key, int rt ) {
  57. if ( tree[rt].l == tree[rt].r ) {
  58. if ( op == ) tree[rt].sumx = max( tree[rt].sumx, key );
  59. else tree[rt].sumy = max( tree[rt].sumy, key );
  60. return ;
  61. }
  62. int m = tree[rt].mid();
  63. if ( pos <= m ) update( op, pos, key, rtl );
  64. else update( op, pos, key, rtr );
  65. if ( op == ) tree[rt].sumx = max( tree[rtl].sumx, tree[rtr].sumx );
  66. else tree[rt].sumy = max( tree[rtl].sumy, tree[rtr].sumy );
  67. }
  68. int query( int op, int L, int R, int rt ) {
  69. if ( L <= tree[rt].l && tree[rt].r <= R ) {
  70. if ( op == ) return tree[rt].sumx;
  71. else return tree[rt].sumy;
  72. }
  73. int m = tree[rt].mid();
  74. if ( L > m ) return query( op, L, R, rtr );
  75. else if ( R <= m ) return query( op, L, R, rtl );
  76. else return max( query( op, L, m, rtl ), query( op, m + , R, rtr ) );
  77. }
  78. int L[maxn], R[maxn], n, sum[maxn];
  79. int main() {
  80. sf( n );
  81. int tot = ;
  82. for ( int i = ; i <= n ; i++ ) {
  83. sff( L[i], R[i] );
  84. sum[tot++] = L[i], sum[tot++] = R[i];
  85. }
  86. sort( sum, sum + tot );
  87. tot = unique( sum, sum + tot ) - sum;
  88. build( , tot, );
  89. LL ans = ;
  90. for ( int i = n ; i >= ; i-- ) {
  91. int a = L[i], b = R[i];
  92. L[i] = lower_bound( sum, sum + tot, L[i] ) - sum + ;
  93. R[i] = lower_bound( sum, sum + tot, R[i] ) - sum + ;
  94. int ny = query( , L[i], tot, );
  95. int nx = query( , R[i], tot, );
  96. ans += b - ny;
  97. ans += a - nx;
  98. // fuck(nx),fuck(ny);
  99. update( , L[i], sum[R[i] - ], );
  100. update( , R[i], sum[L[i] - ], );
  101. }
  102. printf( "%lld\n", ans );
  103. return ;
  104. }

G. Trace ACM-ICPC 2018 徐州赛区网络预赛 线段树写法的更多相关文章

  1. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)

    ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...

  2. ACM-ICPC 2018 徐州赛区网络预赛(8/11)

    ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 枚举第一个选的,接下来的那个不能取前一个的取反 \(DP[i][0]\)表示选和第一个相同的 \(DP[i][1]\) ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

  4. 计蒜客 1460.Ryuji doesn't want to study-树状数组 or 线段树 (ACM-ICPC 2018 徐州赛区网络预赛 H)

    H.Ryuji doesn't want to study 27.34% 1000ms 262144K   Ryuji is not a good student, and he doesn't wa ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)

    传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study

    262144K   Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track

    262144K   Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 I. Characters with Hash

    Mur loves hash algorithm, and he sometimes encrypt another one's name, and call him with that encryp ...

随机推荐

  1. [SHELL]输出目录下所有的可执行文件,批量创建用户

    #!/bin/bash IFS=: for folder in $PATH #PATH变量分隔符为: do echo $folder echo ------------------ for file ...

  2. (转)apktool+dex2jar+jd_gui

    转:http://www.cnblogs.com/MichaelGuan/archive/2011/10/25/2224578.html apktool: 可以解析资源文件,比如布局文件xml等,方便 ...

  3. TCP 的有限状态机

    TCP 有限状态机的图中每一个方框都是 TCP 可能具有的状态. 每个方框中的大写英文字符串是 TCP 标准所使用的 TCP 连接状态名. 状态之间的箭头表示可能发生的状态变迁. 箭头旁边的字,表明引 ...

  4. TCP系列04—连接管理—3、TCP连接的半打开和半关闭

    在前面部分我们我们分别介绍了三次握手.四次挥手.同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Du ...

  5. 转 【关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案】

    关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案 目录 关于api-ms-win-crt-runtimel1-1-0dll缺失的解决方案 目录 安装VC redite ...

  6. IIS7,IIS7.5 URL重写模块工具

    URL 重写模块 2.0 提供基于规则的重写机制,可在 Web 服务器处理请求的 URL 之前对其进行更改,以及在向 HTTP 客户端提供响应内容之前修改响应内容. 注意:使用环境为IIS7.0(x6 ...

  7. 3dContactPointAnnotationTool开发日志(二)

      今天看的时候发现其实www的方式是可以根据指定路径读取本地图片到Image中的.也就是昨天提到的第二种方式.   随便选了个图片做示范: 修改后的代码如下: using System.Collec ...

  8. SpringMVC的工作流程-005

    1.用户发送请求至前端控制器DispatcherServlet           2.DispatcherServlet收到请求调用HandlerMapping处理器映射器.          3. ...

  9. bpf程序

    bpf都是怎么起作用的? 记得bpf之前是绑定在bpf bpf作用在哪里呀?

  10. Kafka Strem

    Overview Concepts Topology Time States Window Hopping time windows Tumbling time windows Sliding win ...