D. Vika and Segments
 
 

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 x1, y1, x2 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
 
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天平行x,y轴的线段

  问你遍历的点有多少个

题解:

  将线段 扩展成一个长度为x * 1 的矩阵

  做一遍线段树扫描线求矩阵面积并

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000") const int N = 5e5+, M = 5e5+, inf = 2e9, mod = 1e9+;
const double Pi = acos(-1.0);
typedef long long LL;
#define ls k<<1
#define rs ls | 1 int san[N], sum[N], vis[N], n, cnt = ;
struct edge{
int l,r,x,in;
edge(int l = , int r = , int x = , int in = ) : l(l), r(r), x(x), in(in) {}
bool operator < (const edge &b) const {
return x < b.x || x == b.x && in > b.in;
}
}e[N];
int Hash(int x) {return lower_bound(san+,san+cnt+,x) - san;}
void push_up(int k,int ll,int rr) {
if(vis[k]) sum[k] = san[rr + ] - san[ll];
else if(ll == rr) sum[k] = ;
else sum[k] = sum[ls] + sum[rs];
}
void update(int l,int r,int c,int ll,int rr,int k) {
if(ll == l && rr == r) {
vis[k] += c;
push_up(k,ll,rr);
return ;
}
int mid = (ll + rr) >> ;
if(r <= mid) update(l,r,c,ll,mid,ls);
else if(l > mid) update(l,r,c,mid+,rr,rs);
else update(l,mid,c,ll,mid,ls), update(mid+,r,c,mid+,rr,rs);
push_up(k,ll,rr);
}
int main() {
scanf("%d",&n);
for(int i = ; i <= n; ++i) {
int x,y,xx,yy;
scanf("%d%d%d%d",&x,&y,&xx,&yy);
if(x > xx) swap(x,xx);
if(y > yy) swap(y,yy);
xx++, yy++;
san[++cnt] = y;
san[++cnt] = yy;
e[i] = edge(y,yy,x,);
e[i+n] = edge(y,yy,xx,-);
} sort(san+,san+cnt+);
cnt = unique(san + , san + cnt + ) - san - ; int m = n << ;
sort(e+,e+m+); LL ans = ;
for(int i = ; i <= m; ++i) {
int l = Hash(e[i].l);
int r = Hash(e[i].r) - ;
if(l <= r) update(l,r,e[i].in,,m,);
ans += 1LL * sum[] * (e[i+].x - e[i].x);
}
cout<<ans<<endl;
}

Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树 矩阵面积并的更多相关文章

  1. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

  2. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  3. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

  4. Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树

    题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...

  5. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  6. Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash

    E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...

  7. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  8. Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)

    题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...

  9. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树

    E. A Simple Task 题目连接: http://www.codeforces.com/contest/558/problem/E Description This task is very ...

随机推荐

  1. springMVC 访问404

    问题:404 但是其他的controller可以访问!!!

  2. 【转】CentOS5.6下配置rsync内网同步数据到外网

    [转]CentOS5.6下配置rsync内网同步数据到外网 本文转自:http://www.linuxidc.com/Linux/2012-06/64070.htm 一.需求 卫士那边有一个需求,就是 ...

  3. 上传文件报错System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse。

    在上传文件的时候报错. 错误: System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetRe ...

  4. css实现图片闪光效果

    1.这个效果是看到京东商城上的一个下效果,原本的思路是 用js控制一个图片在某张需要闪光的图片上重复出现,但是 网上找了一些资料,竟然是用css写的,真是太帅了!!! 2.原理:在需要闪光的图片前添加 ...

  5. springmvc 文件下传、上载、预览。以二进制形式存放到数据库(转载)

    springmvc 文件上传.下载.预览.以二进制形式存放到数据库.数据库中的关于传入附件的字段我写了2个:一个存放内容accessory,一个存放文件的后缀filetype 上传:首先需要2个必须的 ...

  6. php数据访问(批量删除)

    批量删除: 首先给每一行加上复选框,也就是在自增长列内加入checkbox.因为这里可以多选,也可以单选,所以在传值的时候需要传一个数组来进行处理,所以复选框name的值设定一个数组.传值都是传的va ...

  7. php处理图片实现

    <?php include("SimpleImage.php");//图片处理类在下面 $url="http://f3.v.veimg.cn/meadincms/1 ...

  8. 添加thrust的库后出错

    在添加thrust库中的host_vector.h等头文件时 C:\NVIDIA\cudatoolkit\include\thrust\detail\config中的debug.h一直出问题,因此注释 ...

  9. ZooKeeper 配置文件(zoo.cfg)详解

    参数名 说明 clientPort 客户端连接server的端口,即对外服务端口,一般设置为2181吧. dataDir 存储快照文件snapshot的目录.默认情况下,事务日志也会存储在这里.建议同 ...

  10. 数据结构One_Vector(向量的简单实现)

    #include <iostream> using namespace std; template<typename Object> class Vector { privat ...