kmjp's blog

競技プログラミング参加記です

Codeforces #614 Div1 A. NEKO's Maze Game

3完だけど一応レート増してた回。
https://codeforces.com/contest/1292/problem/A

問題

2*Nのグリッドがある。

ここでQ個のクエリが与えられる。
各クエリでは、1つのマスが指定され、そのマスの移動の可否が切り替えられる。
切り替え後の状態において、(1,1)から隣接マスをたどり(2,N)へ移動可能か答えよ。

解法

移動できない条件は、2つの行で列の差が1以内の2マスがともに移動不可な場所がある場合である。
そこで、そのようなマスの対を数え、クエリ毎に増減差分を計算していこう。

int N,Q;
int C[2][202020];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N>>Q;
	int num=0;
	FOR(i,Q) {
		cin>>y>>x;
		y--;
		if(C[y][x]==1) {
			if(C[y^1][x-1]) num--;
			if(C[y^1][x]) num--;
			if(C[y^1][x+1]) num--;
			C[y][x]=0;
		}
		else {
			if(C[y^1][x-1]) num++;
			if(C[y^1][x]) num++;
			if(C[y^1][x+1]) num++;
			C[y][x]=1;
		}
		if(num) cout<<"No"<<endl;
		else cout<<"Yes"<<endl;
	}
	
}

まとめ

まぁこれはまだ簡単だね。