https://www.luogu.org/problemnew/show/P3875

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

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

:数组大小

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

[Luogu] 被污染的河流的更多相关文章

  1. [LUOGU] P3354 [IOI2005]Riv 河流

    题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...

  2. 2019年美国大学生数学建模竞赛(MCM/ICM) E题解题思路

    这也许是我大学生涯最后一次参加数学建模比赛了吧,这次我们选择的问题是E题,以下是我们解题时候的一些思路.很多不易体现的项目产生对环境造成影响的指标可以由一些等同类型的指标来代替,如土地.森林植被被破环 ...

  3. Spark Job调优(Part 2)

    原文链接:https://wongxingjun.github.io/2016/05/11/Spark-Job%E8%B0%83%E4%BC%98-Part-2/ 这篇文章将会完成Part 1中留下的 ...

  4. 使用动态时间规整 (DTW) 解决时间序列相似性度量及河流上下游污染浓度相似性识别分析

    时间序列相似性度量方法 时间序列相似性度量常用方法为欧氏距离ED(Euclidean distance)和动态时间规整DTW(Dynamic Time Warping).总体被分为两类: 锁步度量(l ...

  5. luogu P1494 岳麓山上打水 [iddfs]

    题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...

  6. [luogu P2521] [HAOI2011]防线修建

    [luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...

  7. DNS 工作原理是什么,域名劫持、域名欺骗、域名污染又是什么

    DNS 工作原理是什么,域名劫持.域名欺骗.域名污染又是什么 2014年11月27日 10:05:40 阅读数:6726 标签: dns网络互联网顶级域名递归 更多 个人分类: 网络学习   一.DN ...

  8. BZOJ3772精神污染&BZOJ3488&luogu3242接水果

    LINK1:精神污染 LINK2:[ONTAK2010Highways](http://www.lydsy.com/JudgeOnline/problem.php?id=3488) LINK3:[接水 ...

  9. transformjs污染了DOM?是你不了解它的强大

    原文链接: https://github.com/AlloyTeam/AlloyTouch/wiki/Powerful-transformjs 写在前面 上星期在React微信群里,有小伙伴觉得tra ...

随机推荐

  1. (一)easyUI之第一个demo

    一.下载 官网下载 : http://www.jeasyui.net/download/   同时并下载官方中文API文档. 解压后的目录结构: 二.第一个demo 1      新建工程并导入包 2 ...

  2. Swiper 轮播插件 之 动态加载无法滑动

    1.原因:轮播图未完全动态加载完成,即初始化 2.方法一:ajax链式编程 $.ajax({ type: "get", url: serviceURL + "/listB ...

  3. 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

    原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inn ...

  4. eclipse怎样修改同名包(package)的显示样式、格式

    打开我们的项目,可以看到左侧的package看上去特别多,没有层级. 点击Package Explorer右上角的箭头图标. 可以看到“Flat(扁平)”,“Hierarchical(分层)”两个选项 ...

  5. 【原创】大叔经验分享(89)docker启动openjdk执行jmap报错

    docker启动openjdk后,可以查看进程 # docker exec -it XXX jps 10 XXX.jar 可见启动的java进程id一直为10,然后可以执行jvm命令,比如 # doc ...

  6. INTEL_BIOS 编译—for-ATOM_E3800

    INTEL_BIOS 编译—for-ATOM_E3800 ======================================================================= ...

  7. datagrid行内编辑

    编辑属性 :editor: { type: 'text'} $('#listShow').datagrid({ height : 478, pagesize : 20, pageList : [20, ...

  8. Android中ListView的使用

    1.主要概念 ListView用于将大数据集以列表的形式展示. ListView可以看成一个容器,它有如下继承链: View <- ViewGroup <- AdapterView < ...

  9. 使用 keytool 生成安卓应用程序签名

    下载 keytool jar包: 解压jar包到固定目录 如: cd  /Library/Java/JavaVirtualMachines/ 进入到jar包目录: cd /Library/Java/J ...

  10. 用jq动态给导航菜单添加active

    点击后页面跳转到了新的链接,找到所有的li下的a标签,对其链接地址进行判断,如果和当前浏览器的地址一致,就认为是当前应该激活的菜单,添加active类,否则就取消. <ul class=&quo ...