洛谷 T150024 矩形面积并(扫描线)

题目传送门

扫描线板子.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>

using namespace std;

int n,tot;
long long ans;
map<int,map<int,long long> > la,le;
struct kkk {
	int l,r,v,o;
}e[1005];

inline void pushup(int l,int r) {
	int mid = (l + r) >> 1;
	if(la[l][r] >= 1)
		le[l][r] = r - l + 1;
	else
		if(l != r)
			le[l][r] = le[l][mid] + le[mid+1][r];
		else
			le[l][r] = 0;
}

inline void ch(int L,int R,int v,int l,int r) {
	if(L <= l && R >= r) {
		la[l][r] += v;
		pushup(l,r);
		return ;
	}
	int mid = (l + r) >> 1;
	if(L <= mid) ch(L,R,v,l,mid);
	if(R > mid) ch(L,R,v,mid + 1,r);
	pushup(l,r);
}

inline bool cmp(kkk aa,kkk bb) {
	return aa.v < bb.v;
}

int main() {
//	freopen("rec.in","r",stdin);
//	freopen("rec.out","w",stdout);
	scanf("%d",&n);
	for(int i = 1;i <= n; i++) {
		int x1,y1,x2,y2;
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		e[++tot].l = y1 + 100000001;
		e[tot].r = y2 + 100000001;
		e[tot].v = x1 + 100000001;
		e[tot].o = 1;
		e[++tot].l = y1 + 100000001;
		e[tot].r = y2 + 100000001;
		e[tot].v = x2 + 100000001;
		e[tot].o = -1;
	}
	sort(e+1,e+tot+1,cmp);
	for(int i = 1;i <= tot; i++) {
		ans += le[1][200000002] * (e[i].v - e[i-1].v);
		ch(e[i].l,e[i].r - 1,e[i].o,1,200000002);
	}
	printf("%lld",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/lipeiyi520/p/13842146.html