제출 #1051125

#제출 시각아이디문제언어결과실행 시간메모리
1051125pera공장들 (JOI14_factories)C++17
컴파일 에러
0 ms0 KiB
#include<bits/stdc++.h> #define pii pair<int , int> #define pli pair<long long , int> #include "factories.h" using namespace std; const int MAX = 1e6 + 1 , B = 700 , LOG = 20; const long long oo = 1e16; int T = 0 , n; vector<int> d(MAX) , in(MAX) , order = {0}; vector<vector<int>> g(MAX); vector<long long> D(MAX); vector<vector<long long>> w(MAX); vector<vector<pii>> mn(MAX , vector<pii>(LOG)); void dfs(int u , int p = 0){ order.push_back(u); in[u] = ++T; d[u] = d[p] + 1; for(int x = 0;x < (int)g[u].size();x ++){ if(g[u][x] != p){ D[g[u][x]] = D[u] + w[u][x]; dfs(g[u][x] , u); T++; order.push_back(u); } } } pii MERGE(pii x , pii y){ if(x.second > y.second){ swap(x , y); } return x; } int lca(int u , int v){ // cout << u << " " << v << " " << in[u] << " " << in[v] << endl; if(in[u] > in[v]){ swap(u , v); } int sz = 31 - __builtin_clz(in[v] - in[u] + 1); //cout << mn[in[v] - (1 << sz) + 1][sz].first << " " << mn[in[v] - (1 << sz) + 1][sz].second << endl; return MERGE(mn[in[u]][sz] , mn[in[v] - (1 << sz) + 1][sz]).first; } void Init(int N , int A[] , int B[] , int D[]){ n = N; for(int i = 0;i < N - 1;i ++){ ++A[i] , ++B[i]; g[A[i]].push_back(B[i]); w[A[i]].push_back(D[i]); g[B[i]].push_back(A[i]); w[B[i]].push_back(D[i]); } dfs(1); for(int bit = 0;bit < LOG;bit ++){ if(bit == 0){ for(int i = 1;i < (int)order.size();i ++){ mn[i][bit] = {order[i] , d[order[i]]}; } }else{ for(int i = 1;i + (1 << bit) - 1 < (int)order.size();i ++){ mn[i][bit] = MERGE(mn[i][bit - 1] , mn[i + (1 << (bit - 1))][bit - 1]); } } } } long long Query(int S , int X[] , int T , int Y[]){ long long ans = oo; for(int i = 0;i < S;i ++){ ++X[i]; } for(int i = 0;i < T;i ++){ ++Y[i]; } if(T > B){ vector<long long> e(n + 1 , -1); priority_queue<pli , vector<pli> , greater<pli>> pq; for(int i = 0;i < T;i ++){ e[Y[i]] = 0LL; pq.push({0LL , Y[i]}); } while(pq.size()){ auto [s , u] = pq.top(); pq.pop(); if(s != e[u]){ continue; } for(int x = 0;x < (int)g[u].size();x ++){ if(e[g[u][x]] == -1 || e[g[u][x]] > s + w[u][x]){ e[g[u][x]] = s + w[u][x]; pq.push({e[g[u][x]] , g[u][x]}); } } } for(int i = 0;i < S;i ++){ ans = min(ans , e[X[i]]); } }else{ for(int i = 0;i < S;i ++){ for(int j = 0;j < T;j ++){ ans = min(ans , D[X[i]] + D[Y[j]] - 2 * D[lca(X[i] , Y[j])]); } } } return ans; } int main(){ int aa[6] = {0 , 1 , 2 , 2 , 4 , 1}; int bb[6] = {1 , 2 , 3 , 4 , 5 , 6}; int dd[6] = {4 , 4 , 5 , 6 , 5 , 3}; Init(7 , aa , bb , dd); int xx[2] = {0 , 6}; int yy[2] = {3 , 4}; cout << Query(2 , xx , 2 , yy) << endl; }

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

/usr/bin/ld: /tmp/cc7QPJag.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cc6YScYf.o:factories.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status