Submission #1317477

#TimeUsernameProblemLanguageResultExecution timeMemory
1317477Ekber_EkberKOVANICE (COI15_kovanice)C++20
100 / 100
272 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 _() {
	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);
	}
	for (int i = 1; i <= n; i++) {
		if (!col[dsu.get(i)]) srt(dsu.get(i));
	}
	reverse(all(tp));
	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 : 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];
	}
	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;
}
/*
{"name":"Local: a","url":"/home/ekber/Documents/project/a.cpp","tests":[{"id":1769804740602,"input":"3 4 3\n1<2\n2<3\n1<4\n","output":"K1\nK2\nK3\n?\n"},{"id":1769804821324,"input":"3 5 3\n1<2\n2<4\n3=5\n","output":"K1\nK2\n?\nK3\n?"},{"id":1769804886533,"input":"2 7 6\n1=2\n2=3\n2=7\n3<4\n4=5\n4=6","output":"K1\nK1\nK1\nK2\nK2\nK2\nK1"},{"id":1769805794077,"input":"3 4 3\n1<2\n2<3\n2<4\n","output":"K1\nK2\nK3\nK3\n"},{"id":1769805882693,"input":"4 4 3\n1<2\n2<3\n2<4\n","output":"?\n?\n?\n?\n"},{"id":1769805902044,"input":"4 7 5\n2=7\n1<2\n2<3\n3<5\n4<6\n","output":"K1\nK2\nK3\n?\nK4\n?\nK2\n"},{"id":1769806080684,"input":"2 2 1\n2<1\n","output":"K2\nK1\n"},{"id":1769806468964,"input":"4 4 3\n1<2\n3<2\n2<4\n","output":"?\n?\n?\n?\n"},{"id":1769806574513,"input":"3 3 2\n2<1\n1<3\n","output":"K2\nK1\nK3\n"},{"id":1769806704644,"input":"3 4 3\n1<3\n2<3\n3<4\n","output":"K1\nK1\nK2\nK3\n"},{"id":1769808147200,"input":"3 5 4\n1<2\n2<3\n2<4\n2<5\n","output":"K1\nK2\nK3\nK3\nK3\n"},{"id":1769810125125,"input":"3 5 5\n1<2\n2<5\n3<4\n4<5\n1<4\n","output":"K1\nK2\nK1\nK2\nK3"},{"id":1769811867034,"input":"3 5 4\n1<3\n3<5\n2<4\n4<5","output":"K1\nK1\nK2\nK2\nK3"},{"id":1769813524503,"input":"3 4 4\n1=2\n2<3\n3<4\n1<4","output":"K1\nK1\nK2\nK3\n"},{"id":1769813576079,"input":"3 4 3\n1=2\n2<3\n3<4","output":"K1\nK1\nK2\nK3\n"},{"id":1769813628951,"input":"25 25 24\n1<2\n2<3\n3<4\n4<5\n5<6\n6<7\n7<8\n8<9\n9<10\n10<11\n11<12\n12<13\n13<14\n14<15\n15<16\n16<17\n17<18\n18<19\n19<20\n20<21\n21<22\n22<23\n23<24\n24<25","output":"K1\nK2\nK3\nK4\nK5\nK6\nK7\nK8\nK9\nK10\nK11\nK12\nK13\nK14\nK15\nK16\nK17\nK18\nK19\nK20\nK21\nK22\nK23\nK24\nK25\n\n"},{"id":1769813936255,"input":"3 5 3\n1<2\n2<3\n4<5\n","output":"K1\nK2\nK3\n?\n?\n"},{"id":1769814094839,"input":"3 3 1\n2<3","output":"?\n?\n?"},{"id":1769814101672,"input":"3 4 3\n1<2\n2<3\n4<2","output":"K1\nK2\nK3\nK1\n"},{"id":1769814290007,"input":"3 6 5\n1=2\n4=3\n1<4\n5=6\n5<2\n","output":"K2\nK2\nK3\nK3\nK1\nK1\n"},{"id":1769814675374,"input":"4 4 4\n1<2\n1<3\n3<2\n2<4","output":"K1\nK3\nK2\nK4\n"}],"interactive":false,"memoryLimit":1024,"timeLimit":3000,"srcPath":"/home/ekber/Documents/project/a.cpp","group":"local","local":true}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...