神秘100WA求调
查看原帖
神秘100WA求调
676481
Leoliu9楼主2025/7/21 12:37

Subtask#1的点WA,一直调不出来求助QwQ

#include <bits/stdc++.h>
#define lson p<<1, l, mid
#define rson p<<1|1, mid+1, r
using namespace std;

const int N = 1e5+5;
struct Node{int lb, rb, l, r, u, d, p, q;}a[N<<2];
int n, g[3][N];

void pushup(Node &p, Node ls, Node rs) {
	p.lb = ls.lb, p.rb = rs.rb;
	p.l = ls.l || (ls.u && g[1][ls.rb] && rs.l && g[2][ls.rb] && ls.d);
	p.r = rs.r || (rs.u && g[1][ls.rb] && ls.r && g[2][ls.rb] && rs.d);
	p.u = (ls.u && g[1][ls.rb] && rs.u) || (ls.p && g[2][ls.rb] && rs.q);
	p.d = (ls.d && g[2][ls.rb] && rs.d) || (ls.q && g[1][ls.rb] && rs.p);
	p.p = (ls.u && g[1][ls.rb] && rs.p) || (ls.p && g[2][ls.rb] && rs.d);
	p.q = (ls.d && g[2][ls.rb] && rs.q) || (ls.q && g[1][ls.rb] && rs.u);
}
void build(int p, int l, int r) {
	if (l == r) {a[p] = {l, l, 0, 0, 1, 1, 0, 0}; return;}
	int mid = l + r >> 1;
	build(lson), build(rson);
	pushup(a[p], a[p<<1], a[p<<1|1]);
}
void updatex(int p, int l, int r, int posx, int posy, int val) {
	if (l == r) {g[posx][posy] = val; return;}
	int mid = l + r >> 1;
	if (mid >= posy) updatex(lson, posx, posy, val);
	if (mid <  posy) updatex(rson, posx, posy, val);
	pushup(a[p], a[p<<1], a[p<<1|1]);
}
void updatey(int p, int l, int r, int posy, int val) {
	if (l == r) {a[p].l = a[p].r = a[p].p = a[p].q = val; return;}
	int mid = l + r >> 1;
	if (mid >= posy) updatey(lson, posy, val);
	if (mid <  posy) updatey(rson, posy, val);
	pushup(a[p], a[p<<1], a[p<<1|1]);
}
Node query(int p, int l, int r, int ql, int qr) {
	if (ql <= l && r <= qr) return a[p];
	int mid = l + r >> 1;
	if (mid >= qr) return query(lson, ql, qr);
	if (mid <  ql) return query(rson, ql, qr);
	Node ans; pushup(ans, query(lson, ql, qr), query(rson, ql, qr));
	return ans;
}

int main() {
	cin >> n;
	build(1, 1, n);
	while (1) {
		string op; int x1, y1, x2, y2;
		cin >> op; if (op == "Exit") break;
		cin >> x1 >> y1 >> x2 >> y2;
		if (op == "Close")
			if (y1 == y2) updatey(1, 1, n, y1, 0);
			else updatex(1, 1, n, x1, min(y1, y2), 0);
		if (op == "Open")
			if (y1 == y2) updatey(1, 1, n, y1, 1);
			else updatex(1, 1, n, x1, min(y1, y2), 1);
		if (op == "Ask") {
			if (y1 > y2) swap(x1, x2), swap(y1, y2);
			Node resp = query(1, 1, n, 1, y1);
			Node resm = query(1, 1, n, y1, y2);
			Node resl = query(1, 1, n, y2, n);
			bool ans = 0;
			if (x1 == 1 && x2 == 1) {
				if (resm.u) ans = 1;
				if (resp.r && resm.d && resl.l) ans = 1;
			}
			if (x1 == 2 && x2 == 2) {
				if (resm.d) ans = 1;
				if (resp.r && resm.u && resl.l) ans = 1;
			}
			if (x1 == 1 && x2 == 2) {
				if (resm.p) ans = 1;
				if (resp.r && resm.d) ans = 1;
				if (resl.l && resm.u) ans = 1;
			}
			if (x1 == 2 && x2 == 1) {
				if (resm.q) ans = 1;
				if (resp.r && resm.u) ans = 1;
				if (resl.l && resm.d) ans = 1;
			}
			cout << (ans ? "Y" : "N") << endl;
		}
	}
	return 0;
}
2025/7/21 12:37
加载中...