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. poj 1797(并查集)

    http://poj.org/problem?id=1797 题意:就是从第一个城市运货到第n个城市,最多可以一次运多少货. 输入的意思分别为从哪个城市到哪个城市,以及这条路最多可以运多少货物. 思路 ...

  2. 1.nodejs权威指南--基础知识

    1. 基础知识 1.1 全局作用域及函数 1.1.1 全局作用域 在nodejs中,定义了一个global对象,代表nodejs中的全局命名空间,任何全局变量.函数或对象都是该对象的一个属性值 1.1 ...

  3. WebRequest 获取网页乱码

    问题:在用WebRequest获取网页源码时得到的源码是乱码. 原因:1,编码不对 解决办法:设置对应编码 WebRequest request = WebRequest.Create(Url);We ...

  4. Match:Cyclic Nacklace(KMP的next数组的高级应用)(HDU 3746)

    串珠子 题目大意:给定一个字串,要你找到如果要使之成为循环串,在末尾需要的最小的字数(只能添加字符,不能删减字符) 首先联动一下之前做过的动态规划问题POJ 3280,当然了3280这一题是用的LD, ...

  5. 前端js模版 预编译工具Tmod js使用入门

    1. 安装node js , 2. 用 npm install -g tmodjs  命令安装tmod 3.了解参数配置 4.运行测试例子->命令窗切换到当前文档位置 --->执行tomd ...

  6. ubuntu下安装mysql

    现在的软件越来越好安装,尤其是在ubuntu下安装软件,更是没有技巧,只需要在联网的情况下使用apt-get inatll 即可.在决定安装mysql之前,要先确定系统是否已经安装mysql.如下图: ...

  7. Navicat连接oracle,出现Only compatible with oci version 8.1 and&nb (转)

    与本地oracle连接的时候,一般没问题,sqlplus和oci都是本地oracle自带的,(设置: 工具->选项->oci) 分别为:   oci:D:\app\pcman\produc ...

  8. JSP公用COMMON文件

    head.jsp: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" ...

  9. 【leetcode】Insert Interval(hard)★

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  10. 【编程之美】CPU

    今天开始看编程之美 .第一个问题是CPU的使用率控制,微软的问题果然高大上,我一看就傻了,啥也不知道.没追求直接看答案试了一下.发现自己电脑太好了,4核8线程,程序乱飘.加了一个进程绑定,可以控制一个 ...