답안 #78805

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
78805 2018-10-09T03:54:59 Z tmwilliamlin168 KOVANICE (COI15_kovanice) C++14
100 / 100
442 ms 58748 KB
#include <bits/stdc++.h>
using namespace std;

const int mxN=3e5;
int n, m, v, p[mxN], r[mxN], a[mxN], b[mxN], dp[2][mxN];
vector<int> adj[2][mxN];

int root(int x) {
	return p[x]==x?x:(p[x]=root(p[x]));
}

void join(int x, int y) {
	if((x=root(x))==(y=root(y)))
		return;
	if(r[x]<r[y])
		p[x]=y;
	else
		p[y]=x;
	r[x]+=r[x]==r[y];
}

int cdp(int a, int u) {
	if(!dp[a][u]) {
		dp[a][u]=a?n:1;
		for(int v : adj[a][u])
			dp[a][u]=a?min(cdp(a, v)-1, dp[a][u]):max(cdp(a, v)+1, dp[a][u]);
	}
	return dp[a][u];
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> m >> v;
	for(int i=0; i<m; ++i)
		p[i]=i;
	for(int i=0; i<v; ++i) {
		char qt;
		cin >> a[i] >> qt >> b[i], --a[i], --b[i];
		if(qt=='=') {
			join(a[i], b[i]);
			a[i]=-1;
		} else if(qt=='>')
			swap(a[i], b[i]);
	}
	for(int i=0; i<v; ++i) {
		if(a[i]!=-1) {
			adj[0][root(b[i])].push_back(root(a[i]));
			adj[1][root(a[i])].push_back(root(b[i]));
		}
	}
	for(int i=0; i<m; ++i)
		cout << (cdp(0, root(i))==cdp(1, root(i))?"K"+to_string(cdp(0, root(i))):"?") << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 14588 KB Output is correct
2 Correct 14 ms 14696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 133 ms 22764 KB Output is correct
2 Correct 141 ms 24368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 24368 KB Output is correct
2 Correct 36 ms 24368 KB Output is correct
3 Correct 37 ms 24368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 344 ms 39116 KB Output is correct
2 Correct 347 ms 42452 KB Output is correct
3 Correct 310 ms 46044 KB Output is correct
4 Correct 414 ms 54228 KB Output is correct
5 Correct 442 ms 58748 KB Output is correct