关于空间问题,求解!
查看原帖
关于空间问题,求解!
878013
_Supernova楼主2025/1/22 13:44

为何 NN 要开到 1e61e6 才能过?

#include <bits/stdc++.h>
using namespace std;
#define ls(id) (id * 2)
#define rs(id) (id * 2 + 1)
#define lowbit(x) x&(-x)
#define fi first
#define se second
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
const int N = 1e6 + 5;
ll n;
struct Scanline {
	ll x1, x2, y, opt;
	bool operator < (const Scanline cmp) const {
		return y < cmp.y;
	}
} a[N << 1];
ll unix[N << 1];
struct Treenode {
	ll len, sum;
} tr[N << 2];
ll ans;
void push_up(ll id, ll l, ll r) {
	if (tr[id].sum) tr[id].len = unix[r+1] - unix[l];
	else tr[id].len = tr[ls(id)].len + tr[rs(id)].len;
	return ;
}
void Upd(ll id, ll l, ll r, ll x, ll y, ll opt) {
	if (unix[r+1] <= x || unix[l] >= y) return ;
	if (unix[l] >= x && unix[r+1] <= y) {
		tr[id].sum += opt;
		push_up(id, l, r);
		return ;
	}
	ll mid = (l+r) >> 1;
	Upd(ls(id), l, mid, x, y, opt);
	Upd(rs(id), mid+1, r, x, y, opt);
	push_up(id, l, r);
	return ;
}
void Build(ll id, ll l, ll r) {
	tr[id].len = tr[id].sum = 0;
	if (l == r) return ;
	ll mid = (l+r) >> 1;
	Build(ls(id), l, mid);
	Build(rs(id), mid+1, r);
	return ;
}
int main(void) {
	cin.tie(0);
	cin >> n;
	for (ll i = 1; i <= n; ++i) {
		ll x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;
		a[2*i-1] = (Scanline){x1, x2, y1, 1};
		a[2*i] = (Scanline){x1, x2, y2, -1};
		unix[2*i-1] = x1, unix[2*i] = x2;
	}
	n <<= 1;
	sort(a+1, a+n+1);
	sort(unix+1, unix+n+1);
	ll num = unique(unix+1, unix+n+1) - (unix+1);
	Build(1, 1, num-1);
	for (ll i = 1; i < n; ++i) {
		Upd(1, 1, num-1, a[i].x1, a[i].x2, a[i].opt);
		ans += (ll)tr[1].len * (ll)(a[i+1].y - a[i].y);
	}
	cout << ans;
	return 0;
}
2025/1/22 13:44
加载中...