【模板】扫描线

scanningline

#include <stdio.h>
#include <algorithm>
using namespace std;
#define ull long long
const int z = 1e6+10;
double s[z<<3];
struct NODE {
    ull l, r;
    ull sum;
    ull lazy;
} tree[z<<3];
#define lid(id) (id*2)
#define rid(id) (id*2+1)
#define l(id) tree[id].l
#define r(id) tree[id].r
#define sum(id) tree[id].sum
#define lazy(id) tree[id].lazy
void pushup(int id) {
    if(lazy(id) > 0) 
        sum(id) = r(id)-l(id);
    else 
        sum(id) = sum(lid(id))+sum(rid(id));
}
void construct(int id,int l,int r) {
    if(r-l > 1) {
        l(id) = s[l];
        r(id) = s[r];
        construct(lid(id),l,(l+r)/2);
        construct(rid(id),(l+r)/2,r);
        pushup(id);
    } else {
        l(id) = s[l];
        r(id) = s[r];
        tree[id].sum = 0;
    }
}
void update(int id,ull y1,ull y2,ull flag) {
    if(l(id) == y1&&r(id) == y2) {
    	lazy(id) += flag;
    	pushup(id);
    	return;
	} else {
		if(r(lid(id)) > y1) 
			update(lid(id),y1,min(r(lid(id)),y2),flag);
		if(l(rid(id)) < y2) 
			update(rid(id),max(l(rid(id)),y1),y2,flag);
		pushup(id);
	}
}
struct LINE {
    ull x, y1, y2;
    ull flag;
    bool operator < (LINE object) {
        return x < object.x;
    }
} line[z<<3];
void scanning_line() {
    int n;
    ull x1, x2, y1, y2;
    scanf("%d",&n);
    ull ans = 0;
    for(int i = 1;i <= n;++i) {
        scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2);
        line[i].x = x1;
        line[i].y1 = y1;
        line[i].y2 = y2;
        line[i].flag = 1;
        line[i+n].x = x2;
        line[i+n].y1 = y1;
        line[i+n].y2 = y2;
        line[i+n].flag = -1;
        s[i+1] = y1;
        s[i+n+1] = y2;
    }
    sort(s+2,s+(2*n+2));
    sort(line+1,line+(2*n+1));
    construct(1,2,2*n+1);
    update(1,line[1].y1,line[1].y2,line[1].flag);
    for(int i = 2;i <= 2*n;++i) {
        ans += (line[i].x-line[i-1].x)*tree[1].sum;
        update(1,line[i].y1,line[i].y2,line[i].flag);
    }
    printf("%lld",ans);
}
signed main() {
    scanning_line();
}

@bikuhiku

posted @ 2022-06-08 08:09  bikuhiku  阅读(2)  评论(0编辑  收藏  举报