Submission #1292613

#TimeUsernameProblemLanguageResultExecution timeMemory
1292613yonatanlRigged Roads (NOI19_riggedroads)C++20
58 / 100
2095 ms57012 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>

#define rep(i, s, e) for (ll i = s; i < e; i++)
#define upmax(a, b) a = max(a, b)
#define upmin(a, b) a = min(a, b)

using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using pll = pair<ll, ll>;
using vpll = vector<pll>;
using vvpll = vector<vpll>;

const ll INF = 1e18;

vll depth, par, ans;
map<pll, ll> edges_idx;
vvll tree;

void dfs(ll node, ll papa) {
	for (auto& nei : tree[node]) {
		if (nei == papa) continue;
		depth[nei] = depth[node] + 1;
		par[nei] = node;
		dfs(nei, node);
	}
}

void path(ll a, ll b, vll& idx) {
	if (depth[b] > depth[a]) swap(a, b);
	while (depth[a] > depth[b]) {
		ll mn = min(a, par[a]);
		ll mx = max(a, par[a]);
		a = par[a];
		ll i = edges_idx[{mn, mx}];
		if (ans[i] == -1) {
			idx.push_back(i);
		}
	}
	while (a != b) {
		ll mn = min(a, par[a]);
		ll mx = max(a, par[a]);
		a = par[a];
		ll i = edges_idx[{mn, mx}];
		if (ans[i] == -1) {
			idx.push_back(i);
		}
		
		mn = min(b, par[b]);
		mx = max(b, par[b]);
		b = par[b];
		i = edges_idx[{mn, mx}];
		if (ans[i] == -1) {
			idx.push_back(i);
		}
	}
}

void solve() {
	ll n, m;
	cin >> n >> m;
	vpll edges(m);
	vector<bool> R(m);
	rep(i, 0, m) {
		cin >> edges[i].first >> edges[i].second;
		edges[i].first--, edges[i].second--;
		edges[i] = { min(edges[i].first, edges[i].second), max(edges[i].first, edges[i].second) };
		edges_idx[edges[i]] = i;
	}
	tree.clear(), tree.resize(n);
	depth.clear(), depth.resize(n, 0);
	par.clear(), par.resize(n, -1);
	rep(i, 0, n - 1) {
		ll e;
		cin >> e;
		e--;
		R[e] = 1;
		tree[edges[e].first].push_back(edges[e].second);
		tree[edges[e].second].push_back(edges[e].first);
	}
	ans.clear(), ans.resize(m, -1);
	dfs(0, -1);
	ll curW = 1;
	rep(i, 0, m) {
		if (ans[i] != -1) continue;
		else if (R[i]) {
			ans[i] = curW;
			curW++;
		}
		else {
			vll idx;
			path(edges[i].first, edges[i].second, idx);
			sort(idx.begin(), idx.end());
			rep(j, 0, idx.size()) {
				ans[idx[j]] = curW;
				curW++;
			}
			ans[i] = curW;
			curW++;
		}
	}
	rep(i, 0, m) cout << ans[i] << ' ';
	cout << endl;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...