3
7
2016
0

[Codeforces Round #337] Vika and Segments


D. Vika and Segments
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Vika has an infinite sheet of squared paper. Initially all squares are white. She introduced a two-dimensional coordinate system on this sheet and drew n black horizontal and vertical segments parallel to the coordinate axes. All segments have width equal to 1 square, that means every segment occupy some set of neighbouring squares situated in one row or one column.

Your task is to calculate the number of painted cells. If a cell was painted more than once, it should be calculated exactly once.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of segments drawn by Vika.

Each of the next n lines contains four integers x1y1x2 and y2 ( - 109 ≤ x1, y1, x2, y2 ≤ 109) — the coordinates of the endpoints of the segments drawn by Vika. It is guaranteed that all the segments are parallel to coordinate axes. Segments may touch, overlap and even completely coincide.

Output

Print the number of cells painted by Vika. If a cell was painted more than once, it should be calculated exactly once in the answer.

Examples
input
3
0 1 2 1
1 4 1 2
0 3 2 3
output
8
input
4
-2 -1 2 -1
2 1 -2 1
-1 -2 -1 2
1 2 1 -2
output
16
Note

In the first sample Vika will paint squares (0, 1)(1, 1)(2, 1)(1, 2)(1, 3)(1, 4)(0, 3)and (2, 3).

题目大意:在一个二维平面上,有$n$条宽度为1的水平或垂直线段,求它们的面积并。


经典问题。

首先合并所有方向相同且有交的线段,然后计算所有它们的面积和减去它们的面积交。

求面积交很简单。先离散,然后从下往上扫(方向什么的无所谓啦),用树状数组维护一个数组$a_i$。若碰到一条垂直线段的下端点,假设它在第$x$列上,就更新$a_x=a_x+1$,同理,碰到上端点就更新$a_x=a_x-1$。若碰到水平线段,假设左右端点分别是$x,y$,则在答案中减去$\sum_\limits{i=x}^{y}a_i$。在同一行碰到多种线段时要注意处理的先后顺序。

代码在此。

Category: 题解 | Tags: Codeforces 树状数组 | Read Count: 638

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com