萌新,求查线段树
查看原帖
萌新,求查线段树
242543
Ryo_Yamada楼主2021/1/16 17:15

rt,没过样例,调不出来了 /kk

#define ls id << 1
#define rs id << 1 | 1
#define Mid int mid = (l + r) >> 1

const int N = 2e5 + 5;

int n, m, x[2][N];
int Tree[2][2][N << 2];

void pushup(int id, int mid) {
	Tree[1][1][id] = Tree[0][0][id] = Tree[0][1][id] = Tree[1][0][id] = 0;
	rep(i, 0, 1) {
		rep(j, 0, 1) {
			if(x[0][mid] <= x[0][mid + 1]) Tree[i][j][id] |= (Tree[i][0][ls] & Tree[0][j][rs]);
			if(x[1][mid] <= x[0][mid + 1]) Tree[i][j][id] |= (Tree[i][1][ls] & Tree[0][j][rs]);
			if(x[0][mid] <= x[1][mid + 1]) Tree[i][j][id] |= (Tree[i][0][ls] & Tree[1][j][rs]);
			if(x[1][mid] <= x[1][mid + 1]) Tree[i][j][id] |= (Tree[i][1][ls] & Tree[1][j][rs]);
		}
	}
}

void build(int id, int l, int r) {
	if(l == r) {
		Tree[1][1][id] = Tree[0][0][id] = 1;
		return ;
	}
	Mid;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	pushup(id, mid);
}

void update(int id, int l, int r, int ch, int v, int vv) {
	if(l == r) {
		x[0][l] = v, x[1][l] = vv;
		return ;
	}
	Mid;
	if(mid >= ch) update(ls, l, mid, ch, v, vv);
	else update(rs, mid + 1, r, ch, v, vv);
	pushup(id, mid);
}

int main() {
 	qread(n);
 	rep(i, 1, n) qread(x[0][i], x[1][i]);
 	qread(m);
 	build(1, 1, n);
 	W(m) {
 		int k, y;
		qread(k, y);
		update(1, 1, n, k, x[0][y], x[1][y]);
		update(1, 1, n, y, x[0][k], x[1][k]);
		if(Tree[1][1][1] || Tree[0][0][1] || Tree[1][0][1] || Tree[0][1][1]) puts("TAK");
		else puts("NIE"); 
	}
 	return 0;
}
2021/1/16 17:15
加载中...