扫描线

#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+10;
int n, idx, Y[2*N];
struct line{
	long long o, u, z;
	int b;
	bool operator < (line x){
		return z < x.z;
	}
} ln[2*N];
struct Node{
	int l, r, cnt;
	long long len;
} tr[4*N];
void build(int u, int l, int r){
	tr[u].l = l;
	tr[u].r = r;
	if(l == r) return ;
	int mid = (l+r)>>1;
	build(u<<1, l, mid);
	build(u<<1|1, mid+1, r);
	return ;
}
void pushup(int u){
	if(tr[u].cnt) tr[u].len = Y[tr[u].r+1]-Y[tr[u].l];
	else tr[u].len = tr[u<<1].len + tr[u<<1|1].len;
}
void change(int u, long long L, long long R, int s){
	int l = tr[u].l;
	int r = tr[u].r;
//	cout << u << ' ' << Y[l] << ' ' << Y[r] << ' '<< L << ' ' << R << ' '<< s << endl;
	if(Y[l] >= L && Y[r+1] <= R){
		tr[u].cnt+=s;
		pushup(u);
		return ;
	}
	int mid = (l+r)>>1;
	if(L <= Y[mid]) change(u<<1, L, R, s);
	if(R > Y[mid+1]) change(u<<1|1, L, R, s);
	pushup(u);
}
int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		long long xo, yo, xt, yt;
		scanf("%lld%lld%lld%lld", &xo, &yo, &xt, &yt);
		Y[2*i-1] = yo, Y[2*i] = yt;
		ln[2*i-1].b = 1, ln[2*i-1].o = yt, ln[2*i-1].u = yo, ln[2*i-1].z = xo;
		ln[2*i].b = -1, ln[2*i].o = yt, ln[2*i].u = yo, ln[2*i].z = xt;
	}
	n <<= 1;
	sort(ln + 1, ln + 1 + n);
	sort(Y + 1, Y + 1 + n);
	int m = unique(Y + 1, Y + 1 + n) - Y - 1;
	build(1, 1, m-1);
	long long res = 0;
	for(int i = 1; i < n; i++){
		change(1, ln[i].u, ln[i].o, ln[i].b);
		res += tr[1].len * (ln[i+1].z - ln[i].z);
	}
	printf("%lld", res);
	return 0;
}
posted @ 2026-07-20 21:16  宰杀方向盘  阅读(12)  评论(0)    收藏  举报