제출 #1066661

#제출 시각아이디문제언어결과실행 시간메모리
1066661SoMotThanhXuan자매 도시 (APIO20_swap)C++17
컴파일 에러
0 ms0 KiB
#include <swap.h> #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define MASK(i) (1LL << (i)) #define BIT(x, i) (((x) >> (i)) & 1) #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define FORD(i, a, b) for(int i = b; i >= a; --i) #define REP(i, a, b) for(int i = a; i < b; ++i) #define REPD(i, a, b) for(int i = b; i > a; -- i) #define ALL(v) v.begin(),v.end() #define next __next #define left __left #define right __right #define prev __prev const int MOD[6] = {(int)1e9 + 7, (int)1e9 + 2277, (int)1e9 + 5277, (int)1e9 + 8277, (int)1e9 + 9277, 998244353}; const int BASE[6] = {23309, 300, 330, 280, 2309, 256}; const int base = BASE[0]; const int mod = MOD[0]; void add(int &u, int v){ u += v; if(u >= mod) u -= mod; } void sub(int &u, int v){ u -= v; if(u < 0) u += mod; } void minimize(int &u, int v){ if(u > v) u = v; } void maximize(int &u, int v){ if(u < v) u = v; } void minimizell(long long &u, long long v){ if(u > v) u = v; } void maximizell(long long &u, long long v){ if(u < v) u = v; } const int maxN = 3e5 + 2; const int maxM = 3e5 + 2; const int maxK = 1e2 + 2; const int INF = 1e9 + 8; const long long INFLL = 1e18; const int LOG = 16; vector<pair<int, int>> adj[maxN]; int next[maxN]; bool cycle[maxN]; pair<int, pair<int, int>> edge[maxM]; int n; int root[maxN], high[maxN]; int par[LOG + 1][maxN], Max[LOG + 1][maxN], child[maxN]; int find_root(int v){ return root[v] = root[v] == v ? v : find_root(root[v]); } void dfs(int u, int p){ for(pair<int, int> x : adj[u]){ int v = x.first; int w = x.second; if(v == p)continue; high[v] = high[u] + 1; // cout << u << ' ' << v << "\n"; dfs(v, u); ++child[u]; par[0][v] = u; Max[0][v] = w; } } void dfs2(int u, int p){ if(p){ if(child[p] == 1){ next[u] = Max[0][u]; }else next[u] = next[p]; } for(pair<int, int> x : adj[u]){ int v = x.first; if(v != p)dfs2(v, u); } } void dfs3(int u, int p){ for(pair<int, int> x : adj[u]){ int v = x.first; if(v != p){ dfs3(v, u); cycle[u] |= cycle[v]; } } } void sparse_table(){ } void addEdge(int u, int v, int w){ ++n; u = find_root(u); v = find_root(v); root[n] = n; root[u] = root[v] = n; adj[n].push_back({u, w}); // cout << n << ' ' << u << ' ' << v << "\n"; if(u != v)adj[n].push_back({v, w}); } void init(int N, int M, int U[], int V[], int W[]){ REP(i, 0, M){ edge[i + 1] = {W[i], {U[i] + 1, V[i] + 1}}; } sort(edge + 1, edge + 1 + M); n = N; FOR(i, 1, M)addEdge(edge[i].se.fi, edge[i].se.se, edge[i].fi); dfs(n, 0); high[0] = -1; FOR(i, 1, N)root[i] = i; FOR(j, 1, LOG)FOR(i, 1, n){ par[j][i] = par[j - 1][par[j - 1][i]]; Max[j][i] = max(Max[j - 1][i], Max[j - 1][par[j - 1][i]]); } dfs2(n, 0); // FOR(i, 1, n)cout << child[i] << ' ';cout << "\n"; FOR(i, N + 1, n)if(child[i] == 1)cycle[i] = true; dfs3(n, 0); // FOR(i, 1, n)cout << next[i] << ' ';cout << "\n"; // FOR(i, 1, n)cout << cycle[i] << ' ';cout << "\n"; } int getMinimumFuelCapacity(int u, int v){ int res = 0; if(high[u] < high[v]) swap(u, v); FORD(i, 0, LOG)if(high[par[i][u]] >= high[v])maximize(res, Max[i][u]),u = par[i][u]; if(u == v){ if(cycle[u]) return res; return next[u] == 0 ? -1 : next[u]; } FORD(i, 0, LOG)if(par[i][u] != par[i][v]){ maximize(res, Max[i][u]); maximize(res, Max[i][v]); u = par[i][u]; v = par[i][v]; } maximize(res, Max[0][u]); maximize(res, Max[0][v]); u = par[0][u]; if(cycle[u]){ return res; } else return next[u] == 0 ? - 1 : next[u]; }

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

/usr/bin/ld: /tmp/cc2sO6jS.o: in function `main':
grader.cpp:(.text.startup+0x1c3): undefined reference to `init(int, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status