博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Luogu] 被污染的河流
阅读量:5329 次
发布时间:2019-06-14

本文共 2542 字,大约阅读时间需要 8 分钟。

线段树扫描线求矩形面积并

扫描线的线段树有点奇怪,修改的标记不会下传,标记的意义是当前区间被完整地覆盖了多少次,我们可以根据这个标记来求这个区间覆盖了至少一次的长度和至少两次的长度

:数组大小

#include 
#include
#include
#define gc getchar()using std:: sort;using std:: cout;using std:: min;using std:: max;const int N = 10100;int n, js;int X[N << 2], W[N << 4], F[N << 4];struct Node {
int x_1, x_2, h, how;} lp[N << 1];inline int read() { int x = 0; char c = gc; while(c < '0' || c > '9') c = gc; while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc; return x;}inline void Add(int _x_1, int _y_1, int _x_2, int _y_2) { if(_y_1 == _y_2) { int _1 = _x_1, _2 = _x_2; _x_1 = min(_1, _2); _x_2 = max(_1, _2); lp[++ js].x_1 = _x_1; lp[js].x_2 = _x_2; lp[js].h = _y_1 - 1; lp[js].how = 1; X[js] = _x_1; lp[++ js].x_1 = _x_1; lp[js].x_2 = _x_2; lp[js].h = _y_1 + 1; lp[js].how = -1; X[js] = _x_2; } else { int _1 = _y_1, _2 = _y_2; _y_1 = min(_1, _2); _y_2 = max(_1, _2); lp[++ js].x_1 = _x_1 - 1; lp[js].x_2 = _x_1 + 1; lp[js].h = _y_1; lp[js].how = 1; X[js] = _x_1 - 1; lp[++ js].x_1 = _x_1 - 1; lp[js].x_2 = _x_1 + 1; lp[js].h = _y_2; lp[js].how = -1; X[js] = _x_1 + 1; }}inline bool cmp(Node a, Node b) {
return a.h < b.h;}int Find(int num, int r_) { int L = 1, R = r_, ret; while(L <= R) { int Mid = (L + R) >> 1; if(X[Mid] <= num) L = Mid + 1, ret = Mid; else R = Mid - 1; } return ret;}#define lson jd << 1#define rson jd << 1 | 1void Pushup(int jd, int l, int r) { if(F[jd]) W[jd] = X[r + 1] - X[l]; else if(l == r) W[jd] = 0; else W[jd] = W[lson] + W[rson];}void Sec_G(int l, int r, int jd, int x, int y, int how) { if(x <= l && r <= y) {F[jd] += how; Pushup(jd, l, r); return ;} int mid = (l + r) >> 1; if(x <= mid) Sec_G(l, mid, lson, x, y, how); if(y > mid) Sec_G(mid + 1, r, rson, x, y, how); Pushup(jd, l, r);}int main() { n = read(); for(int i = 1; i <= n; i ++) { int x_1 = read(), y_1 = read(), x_2 = read(), y_2 = read(); Add(x_1, y_1, x_2, y_2); } sort(X + 1, X + js + 1); sort(lp + 1, lp + js + 1, cmp); int k = 1; for(int i = 2; i <= js; i ++) if(X[i] != X[i + 1]) X[++ k] = X[i]; long long Answer = 0; for(int i = 1; i < js; i ++) { int l = Find(lp[i].x_1, k), r = Find(lp[i].x_2, k) - 1; Sec_G(1, k - 1, 1, l, r, lp[i].how); Answer += W[1] * (lp[i + 1].h - lp[i].h); } cout << Answer; return 0;}

 

转载于:https://www.cnblogs.com/shandongs1/p/8543201.html

你可能感兴趣的文章
HDU-1150 Machine Schedule 二分图匹配
查看>>
单例模式的5种写法
查看>>
安卓问题报告小记(四):Some projects cannot be imported because they already exist in the workspace...
查看>>
显示地图
查看>>
无线通信基础(一):无线网络演进
查看>>
如何在工作中快速成长?阿里资深架构师给工程师的10个简单技巧
查看>>
2017.6.4 入门组 NO.4——猜数
查看>>
Eclipse 下载安装
查看>>
WebSocket 时时双向数据,前后端(聊天室)
查看>>
关于cocoa 运行时runtime
查看>>
关于python中带下划线的变量和函数 的意义
查看>>
asp.net 写入excel时,不能更新。数据库或对象为只读。
查看>>
题1简化版
查看>>
linux清空日志文件内容 (转)
查看>>
jsp中对jstl一些标签的引用方式
查看>>
100. Same Tree
查看>>
mkdir命令(转)
查看>>
安卓第十三天笔记-服务(Service)
查看>>
css3学习笔记之背景
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>