제출 #97331

#제출 시각아이디문제언어결과실행 시간메모리
97331igzi공장들 (JOI14_factories)C++17
15 / 100
1760 ms328632 KiB
#include <bits/stdc++.h>
#define INF 1000000000000000
#include "factories.h"
#define maxN 500005

using namespace std;

vector <int> e;
vector <pair<int,int>> adj[maxN];

long long n,d[maxN],s[maxN][21],p[maxN],l[maxN],dis[maxN],ds[2][maxN];

void dfs(int n,int par){
e.push_back(n);
for(int i=0;i<adj[n].size();i++){
if(adj[n][i].first==par) continue;
dis[adj[n][i].first]=dis[n]+adj[n][i].second;
d[adj[n][i].first]=d[n]+1;
dfs(adj[n][i].first,n);
e.push_back(n);
}
}

int minimum(int a,int b){
if(d[a]<d[b]) return a;
return b;
}

void Init(int N,int a[],int b[],int D[]){
n=N;
int i,j;
for(i=0;i<n-1;i++){
adj[a[i]].push_back({b[i],D[i]});
adj[b[i]].push_back({a[i],D[i]});
}
d[0]=0;
dis[0]=0;
dfs(0,-1);
l[1]=0;
for(i=0;i<n;i++){
p[i]=-1;
}
for(i=0;i<e.size();i++){
if(p[e[i]]==-1) p[e[i]]=i;
s[i][0]=e[i];
if(i<2) continue;
if(i==(i & -i)) l[i]=l[i-1]+1;
else l[i]=l[i-1];
}
for(j=1;j<21;j++){
for(i=0;i<e.size();i++){
    if(i+(1<<(j-1))>e.size()) continue;
    s[i][j]=minimum(s[i][j-1],s[i+(1<<(j-1))][j-1]);
}
}
}

void dfs2(int n,int par){
for(int i=0;i<adj[n].size();i++){
if(adj[n][i].first==par) continue;
dfs2(adj[n][i].first,n);
ds[0][n]=min(ds[0][n],ds[0][adj[n][i].first]+adj[n][i].second);
ds[1][n]=min(ds[1][n],ds[1][adj[n][i].first]+adj[n][i].second);
}
}

long long Query(int S,int x[],int T,int y[]){
if(S*T<=n){
int i,j,tmp,a,b,len;
long long ans=INF;
for(i=0;i<S;i++){
    for(j=0;j<T;j++){
        a=min(p[x[i]],p[y[j]]);
        b=max(p[x[i]],p[y[j]]);
        len=b-a+1;
        tmp=minimum(s[a][l[len]],s[b-(1<<l[len])+1][l[len]]);
        ans=min(ans,dis[x[i]]+dis[y[j]]-2*dis[tmp]);
    }
}
return ans;
}
int i;
long long ans=INF;
for(i=0;i<n;i++) ds[0][i]=ds[1][i]=INF;
for(i=0;i<S;i++) ds[0][x[i]]=0;
for(i=0;i<T;i++) ds[1][y[i]]=0;
dfs2(0,-1);
for(i=0;i<n;i++) ans=min(ans,ds[0][i]+ds[1][i]);
return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

factories.cpp: In function 'void dfs(int, int)':
factories.cpp:15:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 for(int i=0;i<adj[n].size();i++){
             ~^~~~~~~~~~~~~~
factories.cpp: In function 'void Init(int, int*, int*, int*)':
factories.cpp:43:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 for(i=0;i<e.size();i++){
         ~^~~~~~~~~
factories.cpp:51:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 for(i=0;i<e.size();i++){
         ~^~~~~~~~~
factories.cpp:52:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(i+(1<<(j-1))>e.size()) continue;
        ~~~~~~~~~~~~^~~~~~~~~
factories.cpp: In function 'void dfs2(int, int)':
factories.cpp:59:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 for(int i=0;i<adj[n].size();i++){
             ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...