扫描线
扫描线
摆烂了 月后,开始学习(复习)的第一个知识点,顺便复习下
再顺便转到博客园,不定时把博客
【模板】扫描线
题目描述
求 个四边平行于坐标轴的矩形的面积并。
输入格式
第一行一个正整数 。
接下来 行每行四个非负整数 ,表示一个矩形的四个端点坐标为 。
输出格式
一行一个正整数,表示 个矩形的并集覆盖的总面积。
样例 #1
样例输入 #1
2
100 100 200 200
150 150 250 255
样例输出 #1
18000
提示
对于 的数据,。
对于 的数据,,,。
好吧,没啥好说的,注意一下离散化的细节问题,建树里面的 要带 ,debug了好久,恼(误
上代码
#include <cstdio>
#include <algorithm>
#include <iostream>
#define int long long
const int maxn = 1e6+10;
using namespace std;
int n,cnt = 0;
int x1,x2,y1,y2,X[maxn<<1];
int read()
{
int x = 0,f = 1;char ch = getchar();
while(ch < '0'||ch > '9'){if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0'&&ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
return x*f;
}
struct Scanline{
int l,r,h;
int mark;
bool operator < (const Scanline &x)const{
return h < x.h;
}
}line[maxn << 1];
int sum[maxn<<2],len[maxn<<2];
void build(int p,int l,int r)
{
len[p] = 0;
sum[p] = 0;
if(l == r) return;
int mid = l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
void pushup(int p,int l,int r)
{
if(sum[p]) len[p] = X[r+1] - X[l];
else len[p] = len[p<<1]+len[p<<1|1];
}
void modify(int p,int l,int r,int L,int R,int c)
{
if(X[r+1]<=L || X[l]>=R) return;
if(L <= X[l]&&X[r+1] <= R)
{
sum[p]+=c;
pushup(p,l,r);
return;
}
int mid = l+r>>1;
modify(p<<1,l,mid,L,R,c);
modify(p<<1|1,mid+1,r,L,R,c);
pushup(p,l,r);
}
signed main()
{
n = read();
for(int i = 1;i <= n;i++)
{
x1 = read(),y1 = read(),x2 = read(),y2 = read();
//printf("%lld-%lld-%lld-%lld\n",x1,y1,x2,y2);
X[2*i-1] = x1;
X[2*i] = x2;
line[2*i-1] = (Scanline){x1,x2,y1,1};
line[2*i] = (Scanline){x1,x2,y2,-1};
}
n<<=1;
sort(line+1,line+n+1);
sort(X+1,X+n+1);
int tot = unique(X+1,X+n+1) - X - 1;
build(1,1,tot-1);
int ans = 0;
for(int i = 1;i < n;i++)
{
modify(1,1,tot-1,line[i].l,line[i].r,line[i].mark);//tot-1注意
ans += len[1]*(line[i+1].h-line[i].h);
}
printf("%lld",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端