Submission #1125642

#TimeUsernameProblemLanguageResultExecution timeMemory
1125642TVSownRigged Roads (NOI19_riggedroads)C++20
100 / 100
489 ms82632 KiB
///*** Sown_Vipro ***/// /// ->NHI QUOC GIA<- /// #include<bits/stdc++.h> using namespace std; //#pragma GCC optimize ("O3") //#pragma GCC optimize ("unroll-loops") //#pragma GCC target("popcnt") #define F first #define S second #define pb push_back #define pi pair<int, int> #define pii pair<int, pair<int, int> > #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define REP(i, a, b) for(int i = a; i >= b; --i) #define all(s) s.begin(), s.end() #define szz(s) int(s.size()) const string NAME = "sown"; const int N = 1e6 + 5, MAX = 1e6, oo = 1e9 + 5, MOD = 1e9 + 7; void maxi(int &x, int y){ if(x < y) x = y; } void mini(int &x, int y){ if(x > y) x = y; }; void add(int &x, int y){ x += y; x += MOD * (x < 0); x -= MOD * (x >= MOD); }; int n, m, cur, root; int p[20][N], idx[N], del[N], h[N], check[N], ans[N], nxt[N]; pi e[N]; vector<pi> adj[N]; void pre(int u){ h[u] = h[p[0][u]] + 1; for(auto [v, i] : adj[u]){ if(v != p[0][u]){ p[0][v] = u; nxt[v] = u; idx[v] = i; pre(v); } } } int lca(int u, int v){ if(h[u] < h[v]) swap(u, v); REP(k, 18, 0){ int pu = p[k][u]; if(h[pu] >= h[v]) u = pu; } if(u == v) return u; REP(k, 18, 0){ int pu = p[k][u], pv = p[k][v]; if(pu != pv){ u = pu; v = pv; } } return p[0][u]; } int Find(int u){ if(!del[u]) return u; return nxt[u] = Find(nxt[u]); } void solve(){ cin >> n >> m; FOR(i, 1, m){ int u, v; cin >> u >> v; e[i] = {u, v}; } FOR(i, 1, n - 1){ int t; cin >> t; check[t] = 1; root = e[t].F; adj[e[t].F].pb({e[t].S, t}); adj[e[t].S].pb({e[t].F, t}); } pre(root); FOR(k, 1, 18){ FOR(u, 1, n) p[k][u] = p[k - 1][p[k - 1][u]]; } // FOR(u, 1, n) cout << u << " " << nxt[u] << " " << idx[u] << "\n"; FOR(i, 1, m){ int u = e[i].F, v = e[i].S; if(ans[i]) continue; if(check[i]){ if(idx[u] == i) del[u] = 1; if(idx[v] == i) del[v] = 1; ans[i] = ++cur; continue; } int w = lca(u, v); // cout << w << "\n"; vector<int> t; while(1){ u = Find(u); if(h[u] <= h[w]) break; // cout << u << " " << idx[u] << "\n"; t.pb(idx[u]); del[u] = 1; } while(1){ v = Find(v); if(h[v] <= h[w]) break; // cout << v << " " << idx[v] << "\n"; t.pb(idx[v]); del[v] = 1; } sort(all(t)); for(int id : t){ ans[id] = ++cur; } ans[i] = ++cur; // break; } FOR(i, 1, m) cout << ans[i] << " "; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); if(fopen((NAME + ".inp").c_str(), "r")){ freopen((NAME + ".inp").c_str(), "r", stdin); // freopen((NAME + ".out").c_str(), "w", stdout); } int t = 1; // cin >> t; while(t--){ solve(); } }

Compilation message (stderr)

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