【模板】扫描线

真正的模板!!
网上的标臭得一匹!!

(Code)

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;

const int N = 1e6 + 5;
int n , X[N << 1];
struct line{
	int h , l , r , v;
}l[N << 1];
struct segment_tree{
	int tag;
	LL len;
}seg[N << 2];

inline bool cmp(line x , line y){return x.h < y.h;}

inline void pushup(int k , int l , int r)
{
	if (seg[k].tag) seg[k].len = (long long)X[r + 1] - X[l];
	else seg[k].len = (long long)seg[k << 1].len + seg[k << 1 | 1].len;
}

inline void update(int l , int r , int k , int x , int y , int v)
{
	if (y <= X[l] || X[r + 1] <= x) return;
	if (x <= X[l] && X[r + 1] <= y)
	{
		seg[k].tag += v;
		pushup(k , l , r);
		return;
	}
	int mid = (l + r) >> 1;
	if (x <= X[mid + 1]) update(l , mid , k << 1 , x , y , v);
	if (y > X[mid + 1]) update(mid + 1 , r , k << 1 | 1 , x , y , v);
	pushup(k , l , r);
}

int main()
{
	scanf("%d" , &n);
	int x , y , x2 , y2;
	for(register int i = 1; i <= n; i++)
	{
		scanf("%d%d%d%d" , &x , &y , &x2 , &y2);
		X[i * 2 - 1] = x , X[i * 2] = x2;
		l[i * 2 - 1] = (line){y , x , x2 , 1};
		l[i * 2] = (line){y2 , x , x2 , -1};
	}
	n <<= 1;
	sort(l + 1 , l + n + 1 , cmp);
	sort(X + 1 , X + n + 1);
	LL ans = 0;
	for(register int i = 1; i < n; i++)
	{
		update(1 , n - 1 , 1 , l[i].l , l[i].r , l[i].v);
		ans += (long long)seg[1].len * (l[i + 1].h - l[i].h);
	}
	printf("%lld" , ans);
}
原文地址:https://www.cnblogs.com/leiyuanze/p/13485657.html