AC 但有疑问
查看原帖
AC 但有疑问
300098
cmaths楼主2023/11/17 07:33
#include <bits/stdc++.h>
#define int long long
#define lx (x * 2)
#define rx (x * 2 + 1)
#define mid ((l + r) >> 1)

using namespace std;

int read()
{
	int x = 0, f = 1;
	char ch = 0;
	while(!isdigit(ch))
	{
		if(ch == '-')
		{
			f = -1;
		}
		ch = getchar();
	}
	while(isdigit(ch))
	{
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}

const int N = 100000;
int n;

struct Sl
{
	int y, l, r, f;
	bool operator < (const Sl &t) const
	{
		return y < t.y;
	}
}sl[N * 2 + 5];

int sub[N * 2 + 5];

struct Tr
{
	int sum, cnt, len;
}tr[N * 2 * 15 + 5];
void build(int x, int l, int r)
{
	if(l == r)
	{
		tr[x].sum = sub[l + 1] - sub[l];
		return;
	}
	build(lx, l, mid);
	build(rx, mid + 1, r);
	tr[x].sum = tr[lx].sum + tr[rx].sum;
}
void add(int x, int l, int r, int id)
{
	if(l >= sl[id].l && r <= sl[id].r)
	{
		tr[x].cnt += sl[id].f;
		if(tr[x].cnt > 0)
		{
			tr[x].len = tr[x].sum;
		}
		else
		{
			tr[x].len = tr[lx].len + tr[rx].len;
		}
		return;
	}
	if(sl[id].l <= mid)
	{
		add(lx, l, mid, id);
	}
	if(sl[id].r > mid)
	{
		add(rx, mid + 1, r, id);
	}
	if(tr[x].cnt > 0)
	{
		tr[x].len = tr[x].sum;
	}
	else
	{
		tr[x].len = tr[lx].len + tr[rx].len;
	}
}

void init()
{
	n = read();
	for(int i = 1; i <= n; i++)
	{
		int x1, y1, x2, y2;
		x1 = read(), y1 = read(), x2 = read(), y2 = read();
		sl[(i - 1) * 2 + 1] = {y1, x1, x2, 1};
		sl[i * 2] = {y2, x1, x2, -1};
		sub[(i - 1) * 2 + 1] = x1, sub[i * 2] = x2;
	}
	n *= 2;
	sort(sub + 1, sub + n + 1);
	sort(sl + 1, sl + n + 1);
//	for(int i = 1; i <= n; i++)
//	{
//		printf("%lld ", sub[i]);
//	}
	sub[n + 1] = sub[n];
//	printf("\n");
	build(1, 1, n);
//	printf("%lld\n", tr[1].sum);
	for(int i = 1; i <= n; i++)
	{
		sl[i].l = lower_bound(sub + 1, sub + n + 1, sl[i].l) - sub;
		sl[i].r = lower_bound(sub + 1, sub + n + 1, sl[i].r) - sub - 1;
	}
//	for(int i = 1; i <= n; i++)
//	{
//		printf("%lld %lld\n", sl[i].l, sl[i].r);
//	}
}

void solve()
{
	int sum = 0;
	for(int i = 1; i < n; i++)
	{
//		printf("111\n");
//		printf("%lld %lld\n", sl[i].l, sl[i].r);
		add(1, 1, n, i);
//		printf("%lld\n", tr[1].len);
		sum += tr[1].len * (sl[i + 1].y - sl[i].y);
	}
	printf("%lld", sum);
}

signed main()
{
//	freopen("scan.in", "r", stdin);
//	freopen("scan111.out", "w", stdout);
	init();
	solve();
	return 0;
}

第 67 行,为了防止数组越界我本来写的是 else if(l != r),但这样改完就错了,想问一下为什么,如果叶子节点代表的这一段区间的 cnt 为 0 不就意味着覆盖的长度为 0 吗

2023/11/17 07:33
加载中...