Codeforces Round #337 (Div. 2) 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.
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.
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.
3
0 1 2 1
1 4 1 2
0 3 2 3
8
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 线段树 矩阵面积并的更多相关文章
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- 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 ...
- 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. ...
- 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 ...
- 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. 这题 ...
- 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 ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- 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所 ...
- 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 ...
随机推荐
- Kendo UI
http://www.cnblogs.com/libingql/category/585455.html http://www.scala-china.net/discuz/forum.php?mod ...
- Java for LeetCode 219 Contains Duplicate II
Given an array of integers and an integer k, find out whether there there are two distinct indices i ...
- 火狐----此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。
FirFox打开80以外的端口,会弹出以下提示: “此地址使用了一个通常用于网络浏览以外的端口.出于安全原因,Firefox 取消了该请求.”.经网上搜索,解决方法如下: 在Firefox地址栏输入a ...
- UIDynamic动画
UIDynamic是从iOS7开始引入的技术 属于UIkit框架 可以模拟显示生活中的物理现象 如碰撞 抖动 摆动等 一.使用UIDynamic步骤: 1.创建一个动力效果器UIDynamicAnim ...
- win8访问win7中的共享文件夹 映射网络驱动器
同一个局域网内,配置好了一台win7(假设计算机名为A)的共享文件夹,设置方法可以参考http://www.doudouxitong.com/guzhang/xitongjiqiao/2014/082 ...
- 解决osg路径与文件名中的中文字符问题
转至:http://blog.csdn.net/zhuqinglu/article/details/2064013 在打开或者保存一个osg模型的时候,经常遇到中文路径或者中文文件名的问题,此时会提示 ...
- Android中shell命令语句
最近学习了Android中碰到了shell命令,故收集终结了一下 Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号 ...
- IT人学习方法论(三):高效学习
一些有关“怎么学”的建议 首先需要明确方向,否则即使学习方法再高效,也不免南辕北辙,背离自己的目标.关于学习方向的讨论,请参见之前的一篇文章 .下面我来重点说一说有关“怎么学”的建议. IT技术,不是 ...
- Jquery.Datatables 服务器处理(Server-side processing)
看了看介绍 http://datatables.club/manual/server-side.html 没有经过处理的分页,先显示出来看看效果,就这样写(存储过程自己写) cshtml " ...
- c++11的初始化
c++11 中类型初始更加方便 比如 vector<int> vec = {1,2,3}; vector<int> vec{1,2,3}; map<string, ...