【模板】掃描線
阿新 • • 發佈:2020-08-12
真正的模板!!
網上的標臭得一匹!!
\(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); }