104432024-04-02 17:06:39111Labirintuscpp17Accepted 100/100365ms93532 KiB
#include<bits/stdc++.h>
using namespace std;

// #define int long long

struct DSU{
	vector<int>v;
	vector<pair<int,int>>s;
	
	DSU(){
	}
	
	DSU(int n):v(n,-1){
	}
	
	int find(int i){
		return v[i]<0?i:find(v[i]);
	}
	
	void unite(int a,int b){
		a=find(a);
		b=find(b);
		if(a==b){
			s.emplace_back(-1,-1);
			s.emplace_back(-1,-1);
			return;
		}
		if(a>b){
			swap(a,b);
		}
		s.emplace_back(a,v[a]);
		s.emplace_back(b,v[b]);
		v[a]+=v[b];
		v[b]=a;
	}
	
	void undo(){
		for(int i=0;i<2;i++){
			auto[a,aa]=s.back();
			s.pop_back();
			if(a!=-1){
				v[a]=aa;
			}
		}
	}
};

int R,C;
DSU d;

int x(int r,int c){
	return r*(C+1)+c;
}

void init_labyrinth(int R_,int C_,std::vector<std::vector<int>>L){
	R=R_,C=C_;
	d=DSU((R+1)*(C+1));
	for(int i=0;i+1<C;i++){
		d.unite(x(R,i),x(R,i+1));
	}
	for(int i=0;i+1<R;i++){
		d.unite(x(i,C),x(i+1,C));
	}
	for(int i=1;i+1<=C;i++){
		d.unite(x(0,i),x(0,i+1));
	}
	for(int i=1;i+1<=R;i++){
		d.unite(x(i,0),x(i+1,0));
	}
	for(int i=0;i<R;i++){
		for(int j=0;j<C;j++){
			if(L[i][j]){
				d.unite(x(i,j),x(i,j+1));
				d.unite(x(i,j),x(i+1,j));
				d.unite(x(i,j),x(i+1,j+1));
			}
		}
	}
}

bool can_escape(int N,std::vector<int>U,std::vector<int>V){
	for(int k=0;k<N;k++){
		int i=U[k],j=V[k];
		d.unite(x(i,j),x(i,j+1));
		d.unite(x(i,j),x(i+1,j));
		d.unite(x(i,j),x(i+1,j+1));
	}
	int ans=d.find(x(R,C-1))!=d.find(x(R-1,C));
	for(int k=0;k<N;k++){
		d.undo();
		d.undo();
		d.undo();
	}
	return ans;
}

#ifdef LOCAL
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int R,C,Q;
	cin>>R>>C>>Q;
	vector<vector<int>>L(R,vector<int>(C));
	for(int i=0;i<R;i++){
		for(int j=0;j<C;j++){
			char c;
			cin>>c;
			L[i][j]=c-'0';
		}
	}
	init_labyrinth(R,C,L);
	while(Q--){
		int N;
		cin>>N;
		vector<int>U(N),V(N);
		for(int i=0;i<N;i++){
			cin>>U[i]>>V[i];
		}
		cout<<can_escape(N,U,V)<<'\n';
	}
	return 0;
}
#endif
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms1996 KiB
2Accepted185ms91432 KiB
subtask215/15
3Accepted28ms5400 KiB
4Accepted8ms5360 KiB
5Accepted120ms3508 KiB
6Accepted120ms3084 KiB
7Accepted79ms5836 KiB
8Accepted81ms5920 KiB
subtask318/18
9Accepted170ms4436 KiB
10Accepted158ms4012 KiB
11Accepted365ms92560 KiB
12Accepted337ms92732 KiB
13Accepted344ms92672 KiB
14Accepted360ms92632 KiB
subtask428/28
15Accepted257ms92672 KiB
16Accepted257ms92668 KiB
17Accepted266ms92804 KiB
18Accepted164ms92808 KiB
19Accepted256ms92804 KiB
20Accepted133ms92808 KiB
21Accepted145ms93072 KiB
22Accepted256ms93072 KiB
23Accepted254ms93080 KiB
subtask539/39
24Accepted35ms3948 KiB
25Accepted17ms3780 KiB
26Accepted122ms4588 KiB
27Accepted120ms3988 KiB
28Accepted119ms4232 KiB
29Accepted120ms3984 KiB
30Accepted356ms92908 KiB
31Accepted340ms93108 KiB
32Accepted231ms93208 KiB
33Accepted328ms93224 KiB
34Accepted230ms93300 KiB
35Accepted230ms93308 KiB
36Accepted277ms93300 KiB
37Accepted273ms93184 KiB
38Accepted291ms93320 KiB
39Accepted284ms93532 KiB