Submission #1264242

#TimeUsernameProblemLanguageResultExecution timeMemory
1264242tminhRigged Roads (NOI19_riggedroads)C++20
100 / 100
267 ms62148 KiB
#include "bits/stdc++.h"
using namespace std;

#define task ""
#define ll long long
#define endl '\n'
#define u first
#define v second
#define vall(a) (a).begin(), (a).end()
#define sze(a) (int)a.size()
#define pii pair<int, int>
#define pll pair<ll, ll>


#define ep emplace_back
#define pb push_back
#define pf push_front


const ll mod = 1e9 + 7;
const int N = 3e5 + 5;
const ll oo = 1e9;

bool START;
int n, m, s[N], a[N], ra[N];
pii e[N];
vector<pii> adj[N]; 

struct ST {
	pii st[N << 2];
	void update(int id, int l, int r, int i, int val) {
		if (l > i || r < i) return;
		if (l == r) {
			st[id] = make_pair(val, i);
			return;
		}
		int mid = (l + r) >> 1;
		update(id << 1, l, mid, i, val);
		update(id << 1 | 1, mid + 1, r, i, val);
		st[id] = min(st[id << 1], st[id << 1 | 1]);
	}
	pii get(int id, int l, int r, int u, int v) {
		if (l > v || r < u) return make_pair(oo, oo);
		if (l >= u && r <= v) return st[id];
		int mid = (l + r) >> 1;
		return min(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v));
	}
} st;


int id[N], ans[N];

int cur = 1;
vector<int> arr;
struct HLD {
	int chain[N], par[N], sz[N], nxt[N], h[N];
	void dfs(int u) {
		sz[u] = 1;
		nxt[u] = 0;
		for (auto [v, w] : adj[u]) {
			if (v == par[u]) continue;
			par[v] = u;
			a[v] = w;
			ra[w] = v;
			h[v] = h[u] + 1;
			dfs(v);
			if (sz[nxt[u]] < sz[v]) nxt[u] = v;
			sz[u] += sz[v];
		}
	}
	int idx = 1;
	void assign_chain(int u, int cur) {
		chain[u] = cur; id[u] = idx++;
		if (nxt[u]) assign_chain(nxt[u], cur);
		for (auto[v, w] : adj[u]) if (v != par[u] && v != nxt[u]) assign_chain(v, v);
	}
	void get(int u, int v) {
		for (; chain[u] != chain[v]; v = par[chain[v]]) {
			if (h[chain[u]] > h[chain[v]]) swap(u, v);
			while(true) {
				auto[val, idx] = st.get(1, 1, n, id[chain[v]], id[v]);
				if (val == oo) break;
				arr.pb(val);
				st.update(1, 1, n, idx, oo);
			}
		}
		if (h[u] > h[v]) swap(u, v);
		while(true) {
			auto[val, idx] = st.get(1, 1, n, id[u] + 1, id[v]);
			if (val == oo) break;
			arr.pb(val);
			st.update(1, 1, n, idx, oo);
		}
			
		sort(vall(arr));
		for (int x : arr) ans[x] = cur++;
		arr.clear();
	}
} hld;

bool check[N];
inline void solve() {
	hld.dfs(1);
	hld.assign_chain(1, 1);
	for (int i = 1; i <= n; ++i) st.update(1, 1, n, id[i], a[i]);
		
	for (int i = 1; i <= m; ++i) {
		if (ans[i]) continue;
		
		if (check[i]) {
			st.update(1, 1, n, id[ra[i]], oo);
			ans[i] = cur++;
			continue;
		}
		
		auto[u, v] = e[i];
		hld.get(u, v);
		ans[i] = cur++;
	}
	for (int i = 1; i <= m; ++i) cout << ans[i] << " ";
}


inline void input() {
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) cin >> e[i].u >> e[i].v;
    for (int i = 1; i < n; ++i) {
    	cin >> s[i];
    	check[s[i]] = true;
    	auto[u, v] = e[s[i]];
    	adj[u].pb(make_pair(v, s[i]));
    	adj[v].pb(make_pair(u, s[i]));
    }
    return solve();
}
bool END;

int main() {
    if(fopen(task ".inp", "r")) {
        freopen(task ".inp", "r", stdin);
        freopen(task ".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    input();
    
    
    cerr << endl << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << 's' << endl;
    cerr << "Memory: " << fabs ((&END - &START)) / 1048576.0 << "MB\n";
    return 0;
}

Compilation message (stderr)

riggedroads.cpp: In function 'int main()':
riggedroads.cpp:140:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |         freopen(task ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
riggedroads.cpp:141:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  141 |         freopen(task ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...