Submission #1317476

#TimeUsernameProblemLanguageResultExecution timeMemory
1317476Ekber_EkberKOVANICE (COI15_kovanice)C++20
100 / 100
276 ms50616 KiB
#include <bits/stdc++.h> #define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define int long long #define endl "\n" #define ff first #define ss second #define pb push_back #define all(v) v.begin(), v.end() using namespace std; constexpr int MAX = 3e+5 + 1, INF = 2e+16, MOD = 1e+9 + 7, K = 31; struct DSU{ int n; vector <int> par; void init(int n1) { n = n1; par.assign(n+1, -1); } int get(int u) { if (par[u] < 0) return u; return par[u] = get(par[u]); } bool un(int a, int b) { a = get(a); b = get(b); if(a == b) return 0; if (par[a] < par[b]) swap(a, b); par[b] += par[a]; par[a] = b; return 1; } }; int k; vector <int> g[MAX+2], g1[MAX+2], dis(MAX+2, 1), dis1(MAX+2, 0), col(MAX+2, 0), tp, tp1; void srt(int u, int c=-1) { col[u] = 1; for (int &i : g[u]) { if (col[i]) continue; srt(i, u); } tp.pb(u); } void srt1(int u, int c=-1) { col[u] = 1; for (int &i : g1[u]) { if (col[i]) continue; srt1(i, u); } tp1.pb(u); } void dfs(int u) { col[u] = 1; int ct=0; for (int &i : g[u]) { ct++; if (col[i]) continue; dfs(i); dis[u] = max(dis[i] + 1, dis[u]); } if (!ct) dis[u] = 1; } void dfs1(int u) { cerr << "in " << u << endl; col[u] = 1; int ct=0; for (int &i : g1[u]) { ct++; if (col[i]) continue; dfs1(i); dis1[u] = max(dis1[i] + 1, dis1[u]); } cerr << "out " << u << ": " << dis1[u]; if (!ct) { dis1[u] = 0; cerr << " upd to 0"; } cerr << endl; } void _() { int n, m; cin >> k >> n >> m; DSU dsu; dsu.init(n); vector <pair<int, int>> e; while(m--) { int a, b; char c; cin >> a >> c >> b; if (c == '<') e.pb({a, b}); else dsu.un(a, b); } for (auto &i : e) { int a = i.ff, b = i.ss; a = dsu.get(a), b = dsu.get(b); g[a].pb(b); g1[b].pb(a); // cerr << "added " << b << " -> " << a << endl; } for (int i = 1; i <= n; i++) { if (!col[dsu.get(i)]) srt(dsu.get(i)); } reverse(all(tp)); // for (int &i : tp) cerr << i << ' '; for (int i = 1; i <= n; i++) col[i] = 0; for (int i = 1; i <= n; i++) { if (!col[dsu.get(i)]) srt1(dsu.get(i)); } reverse(all(tp1)); // for (int i = 1; i <= n; i++) col[i] = 0; // for (int &i : tp) dfs(i); // for (int i = 1; i <= n; i++) col[i] = 0; // for (int &i : tp1) dfs1(i); for (int &i : tp) { for (auto &j : g[i]) { dis[j] = max(dis[j], dis[i] + 1); } } for (int &i : tp1) { for (auto &j : g1[i]) { dis1[j] = max(dis1[j], dis1[i] + 1); } } for (int i = 1; i <= n; i++) { int a = dsu.get(i); dis[i] = dis[a]; dis1[i] = dis1[a]; // cerr << dis[i] << ' ' << dis1[i] << endl; } for (int i = 1; i <= n; i++) { if (dis[i] + dis1[i] == k) { cout << "K" << dis[i] << endl; } else cout << "?\n"; } } signed main() { GOOD_LUCK int tests=1; // cin >> tests; for (int i=1; i <= tests; i++) { _(); cout << endl; } 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...