萌新求助,WA40
查看原帖
萌新求助,WA40
300313
_luanyi_楼主2022/2/12 21:46

rt,WA on #[1,2] #[6,9]

#include <bits/stdc++.h>
#define fq(i,a,b) for (int i = (a); i <= (b); i++)
#define fnq(i,a,b) for (int i = (a); i < (b); i++)
#define nfq(i,a,b) for (int i = (a); i >= (b); i--)
#define nfnq(i,a,b) for (int i = (a); i > (b); i--)
#define fe(u) for (int i = head[u], v; v = edge[i].v, i; i = edge[i].nxt)
using namespace std;

inline int rd () {
	int f = 1;
	char ch = getchar ();
	while (!isdigit (ch)) (ch == '-' ? (f = -1) : 0), ch = getchar ();
	int num = 0;
	while (isdigit (ch)) num = num * 10 + ch - '0', ch = getchar ();
	return num * f;
}
#define rd rd ()
const int maxn = 100100;
bool edge[maxn][3];
struct node {
	bool u, d, l, r, p, q;
	int L, R;
} tree[maxn << 2];
node merge (node l, node r) {
	node ans;
	ans.L = l.L;
	ans.R = r.R;
	ans.l = l.l | l.u & edge[l.R][1] & r.l & edge[l.R][2] & l.d;
	ans.r = r.r | r.u & edge[l.R][1] & l.r & edge[l.R][2] & r.d;
	ans.u = l.u & edge[l.R][1] & r.u | l.p & edge[l.R][2] & r.q;
	ans.d = l.d & edge[l.R][2] & r.d | l.q & edge[l.R][1] & r.p;
	ans.p = l.p & edge[l.R][2] & r.d | l.u & edge[l.R][1] & r.p;
	ans.q = l.q & edge[l.r][1] & r.u | l.d & edge[l.R][2] & r.q;
	return ans;
}
void push_up (int rt) {tree[rt] = merge (tree[rt << 1], tree[rt << 1 | 1]);}
#define mid (l + r >> 1)
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
void build (int l, int r, int rt) {
	if (l == r) tree[rt].L = tree[rt].R = l, tree[rt].u = tree[rt].d = 1;
	else build (lson), build (rson), push_up (rt);
}
void upd1 (int l, int r, int rt, int p, int x, int y) {
	if (mid == p) edge[p][x] = y, push_up (rt);
	else {
		if (p < mid) upd1 (lson, p, x, y);
		else upd1 (rson, p, x, y);
		push_up (rt);
	}
}
void upd2 (int l, int r, int rt, int p, int x) {
	if (l == r) tree[rt].l = tree[rt].r = tree[rt].p = tree[rt].q = x;
	else {
		if (p <= mid) upd2 (lson, p, x);
		else upd2 (rson, p, x);
		push_up (rt);
	}
}
node query (int L, int R, int l, int r, int rt) {
	if (L <= l && r <= R) return tree[rt];
	node ansl, ansr;
	bool flagl = 0, flagr = 0;
	if (L <= mid) flagl = 1, ansl = query (L, R, lson);
	if (R > mid) flagr = 1, ansr = query (L, R, rson);
	if (!flagl) return ansr;
	if (!flagr) return ansl;
	return merge (ansl, ansr);
}
string op; int n = rd;
signed main () {
	build (1, n, 1);
	while (cin >> op) {
		if (op[0] == 'E') exit (0);
		int r1 = rd, c1 = rd, r2 = rd, c2 = rd;
		if (op[0] == 'A') {
			if (c1 > c2) swap (r1, r2), swap (c1, c2);
			node ans1 = query (1, c1, 1, n, 1), ans2 = query (c1, c2, 1, n, 1), ans3 = query (c2, n, 1, n, 1);
			bool flag;
			if (r1 == 1 && r2 == 1) flag = ans2.u | ans1.r & ans2.d & ans3.l | ans1.r & ans2.q | ans2.p & ans3.l;
			if (r1 == 1 && r2 == 2) flag = ans2.p | ans1.r & ans2.d | ans2.u & ans3.l | ans1.r & ans2.q & ans3.l;
			if (r1 == 2 && r2 == 1) flag = ans2.q | ans1.r & ans2.u | ans2.d & ans3.l | ans1.r & ans2.p & ans3.l;
			if (r1 == 2 && r2 == 2) flag = ans2.d | ans1.r & ans2.u & ans3.l | ans1.r & ans2.p | ans2.q & ans3.l;
			cout << (flag ? "Y" : "N") << endl;
		} else {
			if (r1 == r2) upd1 (1, n, 1, min (c1, c2), r1, op[0] == 'O');
			else upd2 (1, n, 1, c1, op[0] == 'O');
		}
	}
	return 0;
}

2022/2/12 21:46
加载中...