Submission #1206004

#TimeUsernameProblemLanguageResultExecution timeMemory
1206004agrim_09철도 요금 (JOI16_ho_t3)C++20
100 / 100
250 ms24164 KiB
// #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; template <class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define endl '\n'; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); #define py cout << "YES" << endl; #define pn cout << "NO" << endl; #define all(x) (x).begin(), (x).end() #define pb push_back #define int long long typedef long long ll; typedef unsigned long long ull; const ll inf = 1e18; const ll mod = 1e9+7; // #ifndef ONLINE_JUDGE // #include "algo/Standard_Stuff/debug.cpp" // #else // #define debug(...) 42 // #endif // void judge(){ // srand(time(NULL)); // #ifndef ONLINE_JUDGE // freopen("1.txt","r",stdin); // freopen("2.txt","w",stdout); // #endif // } struct ufds{ vector<int>par; vector<int>sz; ufds(int n){ par.resize(n); sz.resize(n); for(int i = 0;i<n;i++){ par[i] = i; sz[i] = 1; } } int get(int u){ if(u==par[u]) return u; return par[u] = get(par[u]); } void unite(int u, int v){ //u--; v--; u = get(u); v = get(v); if(u!=v){ if(sz[u]>sz[v]){ swap(u,v); } par[u] = v; sz[v] += sz[u]; } } bool same_comp(int u, int v){ return (get(u)==get(v)); } }; // Look for edge cases!!! signed main(){ //judge(); int n,m,q; cin >> n >> m >> q; vector<vector<int>>adj(n); vector<pair<int, int>>roads; for(int i = 0,u,v;i<m;i++){ cin >> u >> v; u--; v--; adj[u].pb(v); adj[v].pb(u); roads.pb({u,v}); } vector<int>dist(n,inf); queue<int>qu; qu.push(0); dist[0] = 0; //debug(adj[1]); while(qu.size()){ int node = qu.front(); qu.pop(); for(auto child : adj[node]){ if(dist[child]>dist[node]+1){ dist[child] = dist[node] + 1; qu.push(child); } } } ufds p(n); vector<bool>connected_to_1(n,false); connected_to_1[0] = true; vector<vector<int>>adj2(n); auto dfs_add = [&](auto&&self, int u)-> void{ for(auto v : adj2[u]){ p.unite(u,v); self(self,v); } connected_to_1[u] = true; adj2[u].clear(); }; auto join = [&](int u, int v){ if(dist[u]==dist[v]){ return; } if(dist[u]>dist[v]){ swap(u,v); } if(connected_to_1[u]){ p.unite(u,v); dfs_add(dfs_add,v); } else{ adj2[u].pb(v); } }; vector<int>queries(q); vector<bool>road(m,true); for(auto &x : queries){ cin >> x; x--; road[x] = false; } for(int i = 0;i<m;i++){ if(road[i]){ if(dist[roads[i].first]==dist[roads[i].second]){ continue; } if(dist[roads[i].first]>dist[roads[i].second]){ swap(roads[i].first,roads[i].second); } join(roads[i].first,roads[i].second); if(connected_to_1[roads[i].first]){ connected_to_1[roads[i].second] = true; } } } //debug(dist); //debug(connected_to_1); vector<int>ans; for(int i = q-1;i>=0;i--){ ans.pb(p.sz[p.get(0)]); if(dist[roads[queries[i]].first]==dist[roads[queries[i]].second]){ continue; } join(roads[queries[i]].first,roads[queries[i]].second); //debug(connected_to_1); } reverse(ans.begin(),ans.end()); for(auto x : ans){ cout << n-x << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...