제출 #979728

#제출 시각아이디문제언어결과실행 시간메모리
979728vjudge1자매 도시 (APIO20_swap)C++17
24 / 100
2063 ms63452 KiB
#include <time.h> #include <cstdlib> #include <stack> #include <numeric> #include <unordered_map> #include <unordered_set> #include <iomanip> #include <map> #include <set> #include <iterator> #include <deque> #include <queue> #include <sstream> #include <array> #include <string> #include <tuple> #include <chrono> #include <cassert> #include <cstdio> #include <cstring> #include <list> #include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <bitset> #include "swap.h" #include <cassert> #include <cstdio> using namespace std; vector<int> g[200005]; pair<int, int> p[200005]; map<pair<int, int>, int> mp, pos; set<pair<int, int>> st; int x, y, mx; bool ok = 0; vector<int> A, B, C; bool us[200005]; void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) { x = N; y = M; if(x - 1 != y) ok = 1; for(int i = 0; i < M; i++){ int a = U[i] + 1, b = V[i] + 1, c = W[i]; if(a != 1) ok = 1; mp[{a, b}] = c; mp[{b, a}] = c; pos[{a, b}] = i + 1; pos[{b, a}] = i + 1; st.insert({c, i + 1}); A.push_back(a); B.push_back(b); C.push_back(c); } } int kol = 0, kol1 = 0; int dist[200005]; map<pair<int, int>, int> edge; void dfs(int k){ us[k] = 1; kol++; for(int to : g[k]){ if(edge[{k, to}] == 0){ edge[{k, to}]++; edge[{to, k}]++; kol1++; } if(us[to]) continue; dfs(to); } } int getMinimumFuelCapacity(int X, int Y) { if(ok){ X++; Y++; if(x - 1 == y){ for(int i = 1; i <= x; i++) g[i].clear(); for(int i = 0; i < y; i++){ g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } bool f = 0; for(int i = 1; i <= x; i++) if(int(g[i].size()) >= 3) f = 1; if(!f) return -1; } if(x == y){ for(int i = 1; i <= x; i++) g[i].clear(); for(int i = 0; i < y; i++){ g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } bool f = 0; for(int i = 1; i <= x; i++) if(int(g[i].size()) != 2) f = 1; if(!f) return st.rbegin()->first; } int L = 0, R = 1e9 + 1; while(L + 1 < R){ int mid = (L + R) / 2; kol = 0; for(int i = 0; i <= x; i++){ g[i].clear(); us[i] = 0; } for(int i = 0; i < y; i++){ if(C[i] <= mid){ g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } } int kk = 0; edge.clear(); kol1 = kol = 0; dfs(X); for(int i = 1; i <= x; i++) if(us[i] == 1 && g[i].size() >= 3) kk++; if(!us[Y]){ L = mid; continue; } if(kol - 1 == kol1 && kk == 0){ L = mid; continue; } R = mid; continue; } if(R == 1000000001) return -1; return R; } else{ X++; Y++; if(x <= 3) return -1; int mx = 0; if(X != 1) mx = mp[{1, X}]; if(Y != 1) mx = max(mx, mp[{1, Y}]); if(X != 1) st.erase({mp[{1, X}], pos[{1, X}]}); if(Y != 1) st.erase({mp[{1, Y}], pos[{1, Y}]}); pair<int, int> p = *st.begin(); st.erase(st.begin()); if(X != 1 && Y != 1){ st.insert(p); if(X != 1) st.insert({mp[{1, X}], pos[{1, X}]}); if(Y != 1) st.insert({mp[{1, Y}], pos[{1, Y}]}); return max(mx, p.first); } else{ pair<int, int> p1 = *st.begin(); st.insert(p1); st.insert(p); if(X != 1) st.insert({mp[{1, X}], pos[{1, X}]}); if(Y != 1) st.insert({mp[{1, Y}], pos[{1, Y}]}); return max({mx, p.first, p1.first}); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...