P5490 扫描线模板题 90pts #11 WA 求调
  • 板块灌水区
  • 楼主SKQA
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/5 14:50
  • 上次更新2024/7/5 16:21:19
查看原帖
P5490 扫描线模板题 90pts #11 WA 求调
722316
SKQA楼主2024/7/5 14:50

P5490 如题

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 100000;
int n, x1, y, x2, y2, tot, p[MAXN << 1];
long long ans;
struct Line {
	int y, x1, x2, flag;
} line[MAXN << 1];
struct Node {
	int sum, len;
} d[MAXN << 3];
bool cmp(Line a, Line b) {
	return a.y < b.y;
}
void pushup(int u, int l, int r) {
	if(d[u].sum) {
        d[u].len = p[r + 1] - p[l];
    } else if(l == r) {
    	d[u].len = 0;
	} else {
        d[u].len = d[u << 1].len + d[u << 1 | 1].len;
    }
}
void upd(int u, int l, int r, int i, int j, int x) {
	if(i <= p[l] && p[r + 1] <= j) {
		d[u].sum += x;
        pushup(u, l, r);
		return;
	}
	int mid = l + r >> 1;
	if(i < p[mid + 1]) {
        upd(u << 1, l, mid, i, j, x);
    }
	if(j > p[mid + 1]) {
        upd(u << 1 | 1, mid + 1, r, i, j, x);
    }
	pushup(u, l, r);
}
int main() {
	cin >> n;
	for(int i = 1; i <= n; i++) {
		cin >> x1 >> y >> x2 >> y2;
		p[i] = x1;
        p[i + n] = x2;
		line[i].y = y;
        line[i + n].y = y2;
		line[i].x1 = x1;
        line[i + n].x1 = x1,
		line[i].x2 = x2,
        line[i + n].x2 = x2,
		line[i].flag = 1,
        line[i + n].flag = -1;
    }
	sort(p + 1, p + (n << 1) + 1);
	tot = unique(p + 1, p + (n << 1) + 1) - p - 1;
	sort(line + 1, line + (n << 1) + 1, cmp);
	for(int i = 1; i < n << 1; i++)
		upd(1, 1, tot - 1, line[i].x1, line[i].x2, line[i].flag),
		ans += (long long)(line[i + 1].y - line[i].y) * d[1].len;
    cout << ans;
	return 0;
}
2024/7/5 14:50
加载中...