제출 #660724

#제출 시각아이디문제언어결과실행 시간메모리
660724KahouIli (COI17_ili)C++14
100 / 100
1841 ms856 KiB
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int N = 20050;
int n, m, val[N], val2[N];
bool vis[N];
int adjM[N][2];
vector<int> vc;

void dfs(int u) {
	vis[u] = 1;
	if (u>n) for (int v:adjM[u]) {
		if (vis[v]) continue;
		dfs(v);
	}
	vc.push_back(u);
}

void sfd(int u) {
	val[u] = 0;
	if (u>n) for (int v:adjM[u]) {
		sfd(v);
	}
}
void sfd2(int u) {
	val2[u] = 0;
	if (u>n) for (int v:adjM[u]) {
		sfd2(v);
	}
}
bool check(int u) {
	for (int v = 1; v <= n+m; v++) val2[v] = val[v];
	sfd2(u);
	
	for (int v:vc) {
		bool f1 = 0, f2 = 0;
		if(v>n) for (int x:adjM[v]) {
			f1 = f1||(val2[x] == 1);
			f2 = f2||(val2[x]);
		}
		if (f1) val2[v] = 1;
		else if (!f2 && v > n) val2[v] = 0;
		if (val2[v] != 2 && val[v] != 2 && val[v] != val2[v]) return 0;
	}
	return 1;
}

void solve() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) val[i] = 2;
	for (int i = n+1; i <= n+m; i++) {
		char c;
		cin >> c;
		val[i] = (c!='0')+(c=='?');
	}
	for (int v = n+1; v <= n+m; v++) {
		char c1, c2;
		int n1, n2;
		cin >> c1>>n1 >> c2>>n2;
		int u1 = (c1=='c')*n + n1;
		int u2 = (c2=='c')*n + n2;
		adjM[v][0] = u1;
		adjM[v][1] = u2;
	}
	for (int u = 1; u <= n+m; u++) {
		if (!vis[u]) dfs(u);
	}

	for (int u:vc) {
		if (!val[u]) sfd(u);
	}

	for (int u:vc) {
		if (!check(u)) val[u] = 1;
		else if (u > n) {
			bool flg = 0;
			for (int v:adjM[u]) {
				flg = flg||(val[v]);
			}
			if(!flg) val[u] = 0;
		}
	}
	for (int i = 1; i <= m; i++) {
		cout << (char)(val[n+i] < 2? '0'+val[n+i] :'?');
	}
}
int main() {
	solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...