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 ...
随机推荐
- HDFS原理介绍
HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Googl ...
- REACT 学习
1.React/React Native 的ES5 ES6写法对照表 http://bbs.reactnative.cn/topic/15/react-react-native-%E7%9A%84es ...
- 如果你修改了ashx.cs的命名空间
如果你修改了ashx.cs的命名空间,记得要同时修改ashx的WebHandler的Class. 在解决方案资源管理器中右键,查看标记
- FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照
1 FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照 2016.02.18 by 1CM 2 T.. = Timeline support 3 支持时间轴 4 .S. = ...
- ABAP 将SAP用户ID转换成用户名
FORM frm_coverted_name USING usrid TYPE sy-uname CHANGING name TYPE adrp-name ...
- Divide and conquer:Dropping tests(POJ 2976)
最大化平均值 题目大意:给定你n个分数,从中找出k个数,使∑a/∑b的最大值 这一题同样的也可以用二分法来做(用DP会超时,可见二分法是多么的实用呵!),大体上是这样子:假设最大的平均值是w,那么题目 ...
- code vs1517 求一次函数解析式(数论 纯数学知识)
1517 求一次函数解析式 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 相信大家都做过练 ...
- 【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始
第 18 题(数组):题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后, ...
- 【python】正则中的group()
来源:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html 正则表达式中,group()用来提出分组截获的字符串, ...
- 如何查看设备的 UDID
手机连接上电脑,打开 Xcode,确认手机已连上: command+shift+2,就可以查看到 UDID 了: