Submission #337786

#TimeUsernameProblemLanguageResultExecution timeMemory
337786ThistleFactories (JOI14_factories)C++14
18 / 100
8093 ms247016 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; using ll=long long; #define vec vector #define pb push_back #define rng(i,a,b) for(int i=(a);i<(b);i++) #define rep(i,n) rng(i,0,n) #define siz(a) a.size() template<typename T> void chmin(T& a,T b){a=min(a,b);} template<typename T> void chmax(T& a,T b){a=max(a,b);} int n; vec<int>e[600000]; ll dpt[600000]; vec<int>eul; vec<ll>dpto; int out[600000]; int spt[1100000][20]; int lgt[1100000]; int lca(int a,int b){ int x=out[a],y=out[b]; if(x>y) swap(x,y); int k=lgt[(y-x+1)]; int s=spt[x][k],t=spt[y-(1<<k)+1][k]; if(dpto[s]<dpto[t]) return eul[s]; else return eul[t]; } ll dist(int a,int b){ return dpt[a]+dpt[b]-2*dpt[lca(a,b)]; } void Init(int N, int A[], int B[], int D[]) { n=N; map<pair<int, int>, ll>mp; rep(i,n-1){ e[A[i]].pb(B[i]); e[B[i]].pb(A[i]); mp[make_pair(min(A[i],B[i]),max(A[i],B[i]))]=D[i]; } auto dfs=[&](int x,int p,ll d,auto& dfs)->void{ dpt[x]=d; out[x]=siz(eul); eul.pb(x);dpto.pb(d); for(auto g:e[x]){ if(g==p) continue; ll k=mp[make_pair(min(x,g),max(x,g))]; dfs(g,x,d+k,dfs); eul.pb(x);dpto.pb(d); } }; dfs(0,-1,0,dfs); rep(i,siz(eul)) spt[i][0]=i; rng(i,2,siz(eul)+1) lgt[i]=lgt[i>>1]+1; rep(j,19) for(int i=0;i+(1<<(j+1))<=siz(eul);i++){ int a=spt[i][j],b=spt[i+(1<<j)][j]; if(dpto[a]<dpto[b]) spt[i][j+1]=a; else spt[i][j+1]=b; } } long long Query(int S, int X[], int T, int Y[]) { constexpr ll inf=1e17; ll ans=inf; rep(i,S)rep(j,T){ chmin(ans,dist(X[i],Y[j])); } return ans; }

Compilation message (stderr)

factories.cpp: In function 'void Init(int, int*, int*, int*)':
factories.cpp:7:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    7 | #define rng(i,a,b) for(int i=(a);i<(b);i++)
      |                                   ^
factories.cpp:8:18: note: in expansion of macro 'rng'
    8 | #define rep(i,n) rng(i,0,n)
      |                  ^~~
factories.cpp:58:3: note: in expansion of macro 'rep'
   58 |   rep(i,siz(eul)) spt[i][0]=i;
      |   ^~~
factories.cpp:7:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    7 | #define rng(i,a,b) for(int i=(a);i<(b);i++)
      |                                   ^
factories.cpp:59:3: note: in expansion of macro 'rng'
   59 |   rng(i,2,siz(eul)+1) lgt[i]=lgt[i>>1]+1;
      |   ^~~
factories.cpp:61:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |   rep(j,19) for(int i=0;i+(1<<(j+1))<=siz(eul);i++){
      |                                     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...