Submission #1088212

#TimeUsernameProblemLanguageResultExecution timeMemory
1088212dostsFactories (JOI14_factories)C++17
100 / 100
2666 ms225944 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define ff first #define ss second #define sp << " " << #define all(cont) cont.begin(),cont.end() #define vi vector<int> const int MOD = 1e9+7,inf = 2e14; const int N = 5e5+50; int timer = 1; vector<pii> edges[N]; int up[N][20],d[N],tin[N],tout[N],c[N],red[N],blue[N]; void dfs(int node,int p,int dep = 0) { tin[node] = timer++; d[node] = dep; up[node][0] = p; for (auto it : edges[node]) { if (it.ff == p) continue; dfs(it.ff,node,dep+it.ss); } tout[node] = timer-1; } bool anc(int a,int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } int lca(int a,int b) { if (anc(a,b)) return a; if (anc(b,a)) return b; for (int i=19;i>=0;i--) { if (!anc(up[a][i],b)) a = up[a][i]; } return up[a][0]; } vi edg[N]; int solver(int node) { red[node] = blue[node] = inf; if (c[node] == 1) red[node] = d[node]; if (c[node] == 2) blue[node] = d[node]; int ans = inf; for (auto it : edg[node]) { ans = min(ans,solver(it)); red[node] = min(red[node],red[it]); blue[node] = min(blue[node],blue[it]); } //cout << node sp red[node] sp blue[node] sp d[node]<< endl; ans = min(ans,red[node]+blue[node]-2*d[node]); return ans; } void Init(int32_t N, int32_t A[], int32_t B[], int32_t D[]) { int n = N; for (int i=0;i<n-1;i++) { edges[A[i]].push_back({B[i],D[i]}); edges[B[i]].push_back({A[i],D[i]}); } dfs(0,0); for (int i=1;i<20;i++) { for (int j=0;j<n;j++) up[j][i] = up[up[j][i-1]][i-1]; } } long long Query(int32_t S, int32_t X[], int32_t T, int32_t Y[]) { int s = S,t = T; vector<int> nodes; for (int i=0;i<s;i++) { c[X[i]] = 1; nodes.push_back(X[i]); } for (int i=0;i<t;i++) { c[Y[i]] = 2; nodes.push_back(Y[i]); } sort(all(nodes),[&](int n1,int n2) { return tin[n1] < tin[n2]; }); for (int i=0;i<s+t;i++) { nodes.push_back(lca(nodes[i],nodes[(i+1)%nodes.size()])); } sort(all(nodes),[&](int n1,int n2) { return tin[n1] < tin[n2]; }); nodes.erase(unique(all(nodes)),nodes.end()); stack<int> st; st.push(nodes[0]); for (int i=1;i<nodes.size();i++) { while (!anc(st.top(),nodes[i])) { st.pop(); } edg[st.top()].push_back(nodes[i]); st.push(nodes[i]); } int ans = solver(nodes[0]); for (auto it : nodes) edg[it].clear(),c[it] = 0; return ans; }

Compilation message (stderr)

factories.cpp: In function 'long long int Query(int32_t, int32_t*, int32_t, int32_t*)':
factories.cpp:92:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |   for (int i=1;i<nodes.size();i++) {
      |                ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...