Submission #982332

#TimeUsernameProblemLanguageResultExecution timeMemory
982332kwongwengDreaming (IOI13_dreaming)C++17
100 / 100
170 ms31228 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int, int> ii; typedef vector<ii> vii; typedef long double ld; typedef vector<vector<ll>> vll; #define FOR(i, a, b) for(int i = a; i < b; i++) #define ROF(i, a, b) for(int i = a; i >= b; i--) #define pb push_back #define ms memset #define fi first #define se second struct segtree{ vi tl, tr, mx, op; int sz; void build(int v, int l, int r){ tl[v]=l; tr[v]=r; if (l==r) return; int tm = (l+r)/2; build(2*v,l,tm); build(2*v+1,tm+1,r); } void init(int n){ sz=n; tl.assign(4*n,0); tr.assign(4*n,0); mx.assign(4*n,0); op.assign(4*n,0); build(1,0,n-1); } void prop(int v){ if (tl[v]==tr[v]){op[v]=0; return;} int tm = (tl[v]+tr[v])/2; op[2*v] += op[v]; mx[2*v] += op[v]; op[2*v+1] += op[v]; mx[2*v+1] += op[v]; op[v] = 0; } void upd(int v, int l, int r, int val){ //prop(v); if (tl[v]==l && tr[v]==r){ op[v] += val; mx[v] += val; return; } if (l>r) return; int tm = (tl[v]+tr[v])/2; upd(2*v,l,min(r,tm),val); upd(2*v+1,max(l,tm+1),r,val); mx[v] = max(mx[2*v],mx[2*v+1]) + op[v]; } }; const int mxn = 1e5+1; vii g[mxn]; vi p(mxn), dist(mxn), tin(mxn), sz(mxn); vi mx_dist(mxn); vi CC[mxn]; int cc_num = 0; int cur = 0; void dfs(int u){ CC[cc_num].pb(u); tin[u] = cur; cur++; sz[u] = 1; for (ii e : g[u]){ int v = e.fi; if (p[u] == v) continue; dist[v] = dist[u] + e.se; p[v] = u; dfs(v); sz[u] += sz[v]; } } segtree st; int n; void get_mx(int u){ mx_dist[u] = st.mx[1]; for (ii e : g[u]){ int v = e.fi, w = e.se; if (p[u]==v) continue; st.upd(1,0,tin[v]-1,w); st.upd(1,tin[v],tin[v]+sz[v]-1,-w); st.upd(1,tin[v]+sz[v],n-1,w); get_mx(v); st.upd(1,0,tin[v]-1,-w); st.upd(1,tin[v],tin[v]+sz[v]-1,w); st.upd(1,tin[v]+sz[v],n-1,-w); } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { n = N; vi used(N); int ans = 0; vi costs; FOR(i,0,M){ g[A[i]].pb({B[i],T[i]}); g[B[i]].pb({A[i],T[i]}); } FOR(i,0,N){ if (used[i]) continue; used[i] = 1; cc_num++; cur = 0; dfs(i); st.init(sz[i]); n = sz[i]; FOR(j,0,sz[i]){ int v = CC[cc_num][j]; used[v]=1; st.upd(1,tin[v],tin[v],dist[v]); } get_mx(i); int mn = mx_dist[i]; FOR(j,0,sz[i]){ int v = CC[cc_num][j]; mn = min(mn, mx_dist[v]); } costs.pb(mn); } FOR(i,0,N) ans = max(ans, mx_dist[i]); sort(costs.rbegin(), costs.rend()); if (N-M==1) return ans; if (N-M==2) return max(ans,L + costs[0] + costs[1]); return max(ans,max(L+costs[0]+costs[1],2*L+costs[1]+costs[2])); }

Compilation message (stderr)

dreaming.cpp: In member function 'void segtree::prop(int)':
dreaming.cpp:33:13: warning: unused variable 'tm' [-Wunused-variable]
   33 |         int tm = (tl[v]+tr[v])/2;
      |             ^~
#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...