求 \(n\) 个矩形的面积并

Solution

将矩形转化为 \(y_1\) 位置的 + 修改 和 \(y_2\) 位置的 - 修改。然后按照 \(+y\) 顺序依次处理所有的修改,到达的一个新的位置就算一下上一段的总贡献。

至于线段树,要么对 \(x\) 坐标离散化,要么动态开点。 我觉得后者比较快乐。

注意这里的标记没有必要下传

#include <bits/stdc++.h>
using namespace std; const int N = 5000005; struct event{
int x1,x2,y,z;
bool operator < (const event &b) {
return y < b.y;
}
} e[N]; int n,m,a[N],cnt[N],tag[N],ch[N][2],ind=1; void pushup(int p,int l,int r) {
if(p==0) return;
a[0]=0;
if(cnt[p]) a[p]=r-l+1;
else a[p]=a[ch[p][0]]+a[ch[p][1]];
} void modify(int p,int l,int r,int ql,int qr,int c) {
if(l>qr||r<ql) return;
if(l>=ql&&r<=qr) {
cnt[p]+=c;
pushup(p,l,r);
}
else {
if(ch[p][0]==0) ch[p][0]=++ind;
if(ch[p][1]==0) ch[p][1]=++ind;
modify(ch[p][0],l,(l+r)/2,ql,qr,c);
modify(ch[p][1],(l+r)/2+1,r,ql,qr,c);
pushup(p,l,r);
}
} signed main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
++x1; ++x2;
e[i*2-1]=(event){x1,x2,y1,1};
e[i*2]=(event){x1,x2,y2,-1};
m=max(m,x2);
}
sort(e+1,e+2*n+1);
long long ans=0;
for(int i=1;i<=2*n;i++) {
if(e[i].y!=e[i-1].y) ans+=1ll*a[1]*(e[i].y-e[i-1].y);
modify(1,1,m,e[i].x1+1,e[i].x2,e[i].z);
}
cout<<ans<<endl;
}

[P5490] 【模板】扫描线 - 线段树的更多相关文章

  1. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  2. 洛谷P3373 【模板】线段树 2

     P3373 [模板]线段树 2 47通过 186提交 题目提供者HansBug 标签 难度提高+/省选- 提交  讨论  题解 最新讨论 为啥WA(TAT) 题目描述 如题,已知一个数列,你需要进行 ...

  3. hdu 3074 Multiply game(模板级线段树)

    离机房关门还有十分钟,这点时间能干些什么?故作沉思地仰望星空,重新捋一下一天的学习进度,或者,砍掉一棵模板级线段树. 纯模板,就是把单点更新,区间求和改为单点更新,区间求积. 1A. #include ...

  4. 线段树练习 3&&P3372 【模板】线段树 1

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  5. Luogu3373【模板】线段树2

    P3373[模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行 ...

  6. HDU 3642 - Get The Treasury - [加强版扫描线+线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  7. 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树

    [BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...

  8. 洛谷 P3373 【模板】线段树 2 解题报告

    P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...

  9. HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)

    Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...

  10. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树

    题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...

随机推荐

  1. 2019年终总结之SAP项目实践篇

    2019年终总结之SAP项目实践篇 到了临近年底,又是年终总结的时候了. 早在去年12月下旬,笔者就有展望2019年度SAP项目实践计划.当时笔者对于在2019年度SAP项目工作有三大期望或者说三大目 ...

  2. hadoop3自学入门笔记(1)——虚拟机安装和网络配置

    前言 年过30惶惶不安,又逢疫情,还是不断学习,强化自己的能力.hadoop的视频和书籍在15年的时候就看过,但是一直没动手实践过,要知道技术不经过实战,一点提升也没有.因此下定决心边学边做,希望能有 ...

  3. Linux部署MongoDB

    下载安装包 打开网站 https://www.mongodb.com/download-center/community查找与Linux版本一致的MongoDB安装包.我这里选择安装包格式为tgz压缩 ...

  4. Python爬虫实战教程:爬取网易新闻;爬虫精选 高手技巧

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. stars声明很多小伙伴学习Python过程中会遇到各种烦恼问题解决不了.为 ...

  5. Window 系统 Excel 同时打开两个Excel 文件

    问题 我们在使用 Excel 的时候,经常需要打开多个 Excel 文件,但是默认的话我们是只打开一个窗口的.这样不便于我们操作两个 Excel . 解决办法 下载这个补丁进行安装,下载链接 http ...

  6. Appium超详细环境搭建for Mac

      兜兜转转试用了一圈自动化框架后,回归到appium,与一年之前相比,appium有了很大的改变:1.iOS 9 之前一直以 instruments 下的 UIAutomation为驱动底层技术(弊 ...

  7. JS淘宝浏览商品

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  8. 剑指offer-面试题61-扑克牌中的顺子-数组

    /* 题目: 从扑克牌中随机抽取n个数字,判断他们是否连续,扑克牌从A~K,大小王可代替任意数字. */ #include<iostream> #include<cstdlib> ...

  9. 使用ASP.NET Core 3.x 构建 RESTful API - 5.1 输入验证

    说到验证,那就需要做三件事: 定义验证规则 按验证规则进行检查 报告验证的错误.在把错误报告给API消费者的时候,报告里并不包含到底是服务端还是API消费者引起的错误,这是状态码的工作.而通常响应的B ...

  10. JavaScript的语法、数据类型、基本算数和逻辑运算操作

    str.toString() 可以把字符串.数值.布尔值.对象转为字符串 String(str) 任何数值强制转换为字符串类型 <!DOCTYPE html> <html lang= ...