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. MongoDB writeConcern原理解析--转载

    MongoDB支持客户端灵活配置写入策略(writeConcern),以满足不同场景的需求. db.collection.insert({x: 1}, {writeConcern: {w: 1}}) ...

  2. Yii2.0 RESTful API 之速率限制

    Yii2.0 RESTFul API 之速率限制 什么是速率限制? 权威指南翻译过来为限流,为防止滥用,你应该考虑对您的 API 限流. 例如,您可以限制每个用户 10 分钟内最多调用 API 100 ...

  3. preg_replace

    preg_replace — 执行一个正则表达式的搜索和替换 说明: preg_replace ( mixed $pattern , mixed $replacement , mixed $subje ...

  4. Hibernate一对多自关联、多对多关联

    今天分享hibernate框架的两个关联关系    多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删除被控方 禁用级联删除 关联关系编辑,不 ...

  5. 怎样在网页中嵌入JS代码

    有四种方法: 方法1: 在<script>标签内直接写代码 <body> <button id="btn">click</button&g ...

  6. 记录下js几种常见的数组排序和去重的方法

    冒泡排序 , , , , , , , ]; function test(){ ; i < arr.length - ; i++){ ; j < arr.length; j++){ var ...

  7. Linux环境下Redis安装和常见问题的解决

    Redis是一款非常非常非常好用的缓存数据库,在保存需要定期更新的Token值,或者在保证高并发安全可靠性的场景下,基本上说是必用了. 安装过好多次Redis了,也用过阿里云Redis数据库,但是每次 ...

  8. ccs编译.lib

    新建 New一个CCS Project Output type选择"Static Library" 添加源文件 右击工程 -> Add Files- 编译 编译生成的.lib ...

  9. Iterator 其实很简单(最好理解的工厂模式的例子)

    我们都知道Iterator是一个典型的工厂模式的例子.那么我们可能会被这两个名词搞晕.首先,我们会奇怪,为什么iterator可以遍历不同类型的结合,其次,出入程序猿的我们根本不知道工厂模式是什么. ...

  10. 查看SVN当前登录用户

    一般用户登录svn并记住用户密码后,下次再登录的时候将不需要输入用户密码,导致电脑使用着登录的时候,不知道到底登录的是个用户,只能将数据清除,现在给出查看登录用户的方法. 记录svn登录用户的文件,存 ...