Submission #899136

#TimeUsernameProblemLanguageResultExecution timeMemory
899136GrindMachineCity Mapping (NOI18_citymapping)C++17
25 / 100
38 ms8832 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) (int)a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x,y) ((x+y-1)/(y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a,b); } template<typename T> void amax(T &a, T b) { a = max(a,b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* refs: edi */ const int MOD = 1e9 + 7; const int N = 1e3 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; #include "citymapping.h" ll disq[N][N]; ll get_dis(ll u, ll v){ if(u == v) return 0; if(u > v) swap(u,v); if(disq[u][v] != -1) return disq[u][v]; return disq[u][v] = get_distance(u,v); } bool on_path(ll w, ll u, ll v){ // does w lie on the path from u to v? return get_dis(u,w)+get_dis(w,v) == get_dis(u,v); } vector<ll> adj[N]; vector<bool> rem(N); vector<ll> subsiz(N); vector<ll> tin(N), tout(N); ll timer = 1; void dfs1(ll u, ll p){ tin[u] = timer++; subsiz[u] = 1; trav(v,adj[u]){ if(v == p or rem[v]) conts; dfs1(v,u); subsiz[u] += subsiz[v]; } tout[u] = timer-1; } bool is_ances(ll u, ll v){ // is u an ances of v? return tin[u] <= tin[v] and tout[u] >= tout[v]; } void find_roads(int n, int q, int A[], int B[], int W[]) { memset(disq,-1,sizeof disq); vector<ll> dis(n+5); for(int i = 2; i <= n; ++i){ dis[i] = get_dis(1,i); } vector<pll> order; rep1(i,n) order.pb({dis[i],i}); sort(all(order)); ll ptr = 0; rep1(i,n-1){ ll u = order[i].ss; fill(all(rem),0); ll p = -1; while(true){ vector<ll> active; rep(j,i){ ll v = order[j].ss; if(rem[v]) conts; active.pb(v); } if(sz(active) == 1){ p = active[0]; break; } ll root = active[0]; timer = 1; dfs1(root,-1); ll nodes = sz(active); ll want = nodes/2; pll closest = {inf2,inf2}; trav(v,active){ pll px = {abs(want-subsiz[v]),v}; amin(closest,px); } ll sub_node = closest.ss; vector<ll> in_sub; trav(v,active){ if(is_ances(sub_node,v)){ in_sub.pb(v); } } if(on_path(sub_node,root,u)){ // in sub of sub_node trav(v,active){ rem[v] = 1; } trav(v,in_sub){ rem[v] = 0; } } else{ // not in sub of v trav(v,in_sub){ rem[v] = 1; } } } A[ptr] = p; B[ptr] = u; W[ptr] = dis[u]-dis[p]; ptr++; adj[p].pb(u), adj[u].pb(p); } }
#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...