求助WA50
查看原帖
求助WA50
96340
AC机楼主2020/7/12 01:19
#include <cstdio>
#include <cctype>

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

const int maxn = 5e5;

struct node {
	bool value[5][5];
	node *left, *right;
}seg[maxn<<1], *root = seg;

int tot_seg;

bool x[2][maxn], y[maxn];

inline void update (node *p, int mid) {
	register bool a = x[0][mid], b = x[1][mid];
	for(register int i=0; i<4; ++i)
		for(register int j=0; j<4; ++j)
			p -> value[i][j] = i == j;
	p -> value[0][1] = p -> value[1][0] =
						p -> left -> value[0][1] ||
						(p -> left -> value[0][3] && a && p -> right -> value[0][1] && b && p -> left -> value[2][1]);
	p -> value[0][2] = p -> value[2][0] =
						(p -> left -> value[0][3] && a && p -> right -> value[0][2]) ||
						(p -> left -> value[0][2] && b && p -> right -> value[1][2]);
	p -> value[0][3] = p -> value[3][0] =
						(p -> left -> value[0][3] && a && p -> right -> value[0][3]) ||
						(p -> left -> value[0][2] && b && p -> right -> value[1][3]);
	p -> value[1][2] = p -> value[2][1] =
						(p -> left -> value[1][2] && b && p -> right -> value[1][2]) ||
						(p -> left -> value[1][3] && a && p -> right -> value[0][2]);
	p -> value[1][3] = p -> value[3][1] =
						(p -> left -> value[1][2] && b && p -> right -> value[1][3]) ||
						(p -> left -> value[1][3] && a && p -> right -> value[0][3]);
	p -> value[2][3] = p -> value[3][2] =
						p -> right -> value[2][3] ||
						(p -> right -> value[3][0] && a && p -> left -> value[3][2] && b && p -> right -> value[1][2]);
}

inline node update (node left, node right, int mid) {
	register bool a = x[0][mid], b = x[1][mid];
	node nw;
	for(register int i=0; i<4; ++i)
		for(register int j=0; j<4; ++j)
			nw.value[i][j] = i == j;
	nw.value[0][1] = nw.value[1][0] =
						left.value[0][1] ||
						(left.value[0][3] && a && right.value[0][1] && b && left.value[2][1]);
	nw.value[0][2] = nw.value[2][0] =
						(left.value[0][3] && a && right.value[0][2]) ||
						(left.value[0][2] && b && right.value[1][2]);
	nw.value[0][3] = nw.value[3][0] =
						(left.value[0][3] && a && right.value[0][3]) ||
						(left.value[0][2] && b && right.value[1][3]);
	nw.value[1][2] = nw.value[2][1] =
						(left.value[1][2] && b && right.value[1][2]) ||
						(left.value[1][3] && a && right.value[0][2]);
	nw.value[1][3] = nw.value[3][1] =
						(left.value[1][2] && b && right.value[1][3]) ||
						(left.value[1][3] && a && right.value[0][3]);
	nw.value[2][3] = nw.value[3][2] =
						right.value[2][3] ||
						(right.value[3][0] && a && left.value[3][2] && b && right.value[1][2]);
	return nw;
} 

void build (int l, int r, node *p = root) {
	if(l == r) {
		for(register int i=0; i<4; ++i)
			for(register int j=0; j<4; ++j)
				p -> value[i][j] = (i == j) || (y[l]);
		p -> value[0][3] = p -> value[3][0] = p -> value[1][2] = p -> value[2][1] = 1;
		return ;
	}
	register int mid = (l + r) >> 1;
	p -> left = seg + ++ tot_seg;
	build (l, mid, p -> left);
	p -> right = seg + ++tot_seg;
	build (mid+1, r, p -> right);
	update (p, mid);
}

void modify (int l, int r, int c, node *p = root) {
	if(l == r) {
		for(register int i=0; i<4; ++i)
			for(register int j=0; j<4; ++j)
				p -> value[i][j] = (i == j) || (y[l]);
		p -> value[0][3] = p -> value[3][0] = p -> value[1][2] = p -> value[2][1] = 1;
		return ;
	}
	register int mid = (l + r) >> 1;
	if(c <= mid) modify (l, mid, c, p -> left);
	else modify (mid+1, r, c, p -> right);
	update (p, mid);
}

void modify1 (int l, int r, int c, node *p = root) {
	if(l == r) {
		for(register int i=0; i<4; ++i)
			for(register int j=0; j<4; ++j)
				p -> value[i][j] = (i == j) || (y[l]);
		p -> value[0][3] = p -> value[3][0] = p -> value[1][2] = p -> value[2][1] = 1;
		return ;
	}
	register int mid = (l + r) >> 1;
	if(c < mid) modify (l, mid, c, p -> left);
	else if(c > mid) modify (mid+1, r, c, p -> right);
	update (p, mid);
}

node query (int l, int r, int ql, int qr, node *p = root) {
	if(ql <= l && r <= qr) return *p;
	register int mid = (l + r) >> 1;
	if(ql <= mid)
		if(mid < qr) {
			node tpa = query (l, mid, ql, qr, p -> left);
			node tpb = query (mid+1, r, ql, qr, p -> right);
			return update (tpa, tpb, mid);
		} else return query (l, mid, ql, qr, p -> left);
	else return query (mid+1, r, ql, qr, p -> right);
}

char c[15];

int main (void) {
	int n = read();
	build (1, n);
	while(1) {
		scanf("%s", c+1);
		if(c[1] == 'E') {
			return 0;
		} else if(c[1] == 'O') {
			int r1, c1, r2, c2;
			r1 = read(); c1 = read();
			r2 = read(); c2 = read();
			if(r1 == r2) {
				if(c1 < c2) {
					x[r1-1][c1] = 1;
					modify1 (1, n, c1);
				} else {
					x[r1-1][c2] = 1;
					modify1 (1, n, c2);
				}
			} else {
				y[c1] = 1;
				modify (1, n, c1);
			}
		} else if(c[1] == 'C') {
			int r1, c1, r2, c2;
			r1 = read(); c1 = read();
			r2 = read(); c2 = read();
			if(r1 == r2) {
				if(c1 < c2) {
					x[r1-1][c1] = 0;
					modify1 (1, n, c1);
				} else {
					x[r1-1][c2] = 0;
					modify1 (1, n, c2);
				}
			} else {
				y[c1] = 0;
				modify (1, n, c1);
			}
		} else if(c[1] == 'A') {
			int r1, c1, r2, c2;
			r1 = read(); c1 = read();
			r2 = read(); c2 = read();
			if(c1 > c2) {
				c1 ^= c2 ^= c1 ^= c2;
				r1 ^= r2 ^= r2 ^= r1;
			}
			node tp, tpl, tpr;
			tp = query (1, n, c1, c2);
			tpl = query (1, n, 1, c1);
			tpr = query (1, n, c2, n);
			bool flag = 0;
			if(r1 == 1 && r2 == 1) {
				flag = flag || tp.value[0][3];
				flag = flag || (tpl.value[3][2] && tp.value[1][3]);
				flag = flag || (tp.value[0][2] && tpr.value[1][0]);
				flag = flag || (tpl.value[3][2] && tp.value[1][2] && tpr.value[1][0]);
			} else if(r1 == 1 && r2 == 2) {
				flag = flag || tp.value[0][2];
				flag = flag || (tpl.value[3][2] && tp.value[1][2]);
				flag = flag || (tp.value[0][3] && tpr.value[0][1]);
				flag = flag || (tpl.value[3][2] && tp.value[1][3] && tpr.value[0][1]);
			} else if(r1 == 2 && r2 == 1) {
				flag = flag || tp.value[1][3];
				flag = flag || (tpl.value[2][3] && tp.value[0][3]);
				flag = flag || (tp.value[1][2] && tpr.value[1][0]);
				flag = flag || (tpl.value[2][3] && tp.value[0][2] && tpr.value[1][0]);
			} else if(r1 == 2 && r2 == 2) {
				flag = flag || tp.value[1][2];
				flag = flag || (tpl.value[2][3] && tp.value[0][2]);
				flag = flag || (tp.value[1][3] && tpr.value[1][0]);
				flag = flag || (tpl.value[2][3] && tp.value[0][3] && tpr.value[1][0]);
			}
			printf("%c\n", flag ? 'Y' : 'N' );
		}
	}
	return 0;
}

@Rem°

@Irressey

@Terminus_Est

@HoneyLemon

2020/7/12 01:19
加载中...