为什数组开到1e6WA了8个点
查看原帖
为什数组开到1e6WA了8个点
421372
H_T_Y楼主2022/11/13 14:46
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1e6 + 10;


struct cline {
	long long l, r, h;
	long long pd;
	bool operator < (const cline x) const {
		return h < x.h;
	}
}line[MAXN];
struct tree {
	long long l, r, res;
	long long len;
}tree[MAXN];
long long X[MAXN];
long long n, x1, x2, y1, y2;
void build(long long idx, long long left, long long right) {
	tree[idx].l = left, tree[idx].r = right;
	tree[idx].len = 0;
	tree[idx].res = 0;
	if(left == right) return ;
	long long mid = (left + right) >> 1;
	build (idx << 1, left, mid);
	build(idx << 1 | 1, mid + 1, right);
	return ;
}
void pushup(long long idx) {
	long long l = tree[idx].l, r = tree[idx].r;
	if(tree[idx].res) {
		tree[idx].len = X[r + 1] - X[l];
	}
	else tree[idx].len = tree[idx << 1 | 1].len + tree[idx << 1].len;
}
void change (long long idx, long long left, long long right, long long c) {
	
	long long l = tree[idx].l, r = tree[idx].r;
	if(X[r + 1] <= left || X[l] >= right ){
		return ;
	}
	if(X[r + 1] <= right && X[l] >= left) {
		tree[idx].res += c;
		pushup(idx);
		return ;
	}
	change(idx << 1, left, right, c);
	change(idx << 1 | 1, left, right, c);
	pushup(idx);
}
int main () {
	cin >> n;
	for(long long i = 1; i <= n; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		X[i * 2 - 1] = x1;
		X[i * 2] = x2;
		line[i * 2 - 1] = (cline){x1, x2, y1, 1};
		line[i * 2]= (cline){x1, x2, y2, -1};
	}
	n <<= 1;
	sort(X + 1, X + n + 1);
	sort(line + 1, line + n + 1);
	long long tot = unique(X + 1, X + n + 1) - X - 1;	
	build(1, 1, tot - 1);
	
	long long ans = 0;
	for(long long i = 1; i < n; i++) {
		change (1, line[i].l, line[i].r, line[i].pd);
		ans += tree[1].len * (line[i + 1].h - line[i].h);
	}
//	for(int i = 1; i <= n; i++) cout << tree[i].len << endl;
	cout << ans;
}

rt

为什么数组开到1e6会WA八个点,开到2e6才能AC

2022/11/13 14:46
加载中...