제출 #1319448

#제출 시각아이디문제언어결과실행 시간메모리
1319448lernKOVANICE (COI15_kovanice)C++20
100 / 100
150 ms33032 KiB
#include <bits/stdc++.h> using namespace std; struct DSU{ vector<int> p; void init(int n) { p.assign(n, -1); } int get(int a) { if (p[a] < 0) return a; return p[a] = get(p[a]); } bool unite(int a, int b) { a = get(a); b = get(b); if (a == b) return false; if (p[a] > p[b]) swap(a, b); p[a] += p[b]; p[b] = a; return true; } }; vector<int> L,R; vector<vector<int>> gl,gr; int dfsl(int node){ if (L[node] != -1) return L[node]; int res = 1; for (int i : gl[node]) { res = max(res, 1 + dfsl(i)); } return L[node] = res; } int dfsr(int node){ if (R[node] != -1) return R[node]; int res = 1; for (int i : gr[node]) { res = max(res, 1 + dfsr(i)); } return R[node] = res; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, v; cin>>n>>m>>v; DSU dsu; dsu.init(m); L.assign(m, -1); R.assign(m, -1); gl.assign(m, {}); gr.assign(m, {}); vector<pair<int,int>> queries; for (int i = 0; i < v; i++) { int a,b; char c; cin>>a>>c>>b; a--; b--; if (c == '=') { dsu.unite(a, b); } else { queries.push_back({a, b}); } } for (auto &q : queries) { int a = dsu.get(q.first); int b = dsu.get(q.second); if (a != b) { gr[a].push_back(b); gl[b].push_back(a); } } for (int i = 0; i < m; i++) { int root = dsu.get(i); int left = dfsl(root); int right = dfsr(root); if ((left + right) == (n + 1)) { cout<<"K"<<left<<"\n"; } else { cout<<"?\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...