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. Scratch—实现一个按钮的动画效果

    上次介绍了利用克隆体操作生成菜单按钮,今天讲一讲如何让一个按钮具有动画的效果:当鼠标移到某个按钮上面时,显示动画效果 让菜单按钮有虚像效果 让菜单具有逐渐变大的效果 改变菜单按钮的颜色 其他的特效都是 ...

  2. python 创建es mapping

    import requests def get_(): url = "http://127.0.0.1:9200/indextest/_mapping?pretty" ss = r ...

  3. Linux 截取日志命令

    1.截取时间段 截取 2019-06-25 10:10 到 2019-06-25 10:20 之间的日志记录,apollo-service.log 为你要截取的文件名称, new2.log 截取之后保 ...

  4. Kafka 消息中间件

    kafka简介与应用场景 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Link ...

  5. CMake入门-03-还是HelloWorld

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! 扩展-math 目录里的文件编译成静态库再由 main 函数调用 ...

  6. (三)Activiti之第一个程序以及Activiti插件的使用和Activiti表的解释

    一.案例 1.1 建立Activiti Diagram图 new -> activiti ->Activiti Diagram,创建一个HelloWorld文件,后缀自动为bpmn,如下图 ...

  7. 奇妙的算法【10】TX--有效号码、最,小耗时、最小差值、差值输出、异或结果

    昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的 ...

  8. IO流的部分类简述

    InputStream 类: InputStream 位于 java.io 包中,它是一个抽象类,表示字节输入流,需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法 ...

  9. stm32 rtc 实时时钟

    STM32的实时时钟是一个独立的定时器 通常会在后备区域供电端加一个纽扣电池,当主电源没有电的时,RTC不会停止工作 若VDD电源有效,RTC可以触发秒中断.溢出中断和闹钟中断 备份寄存器BKP 备份 ...

  10. U盘不能复制4G以上的单个文件如何处理?

    制作好雨后清风U盘启动盘后,有朋友在将雨后清风系统镜像文件拷贝传输至U盘时,会发现U盘提示文件过大,无法进行传输,但是U盘的剩余存储空间明显还足够,这是怎么回事呢? 其实这是U盘文件系统格式的原因,如 ...