제출 #489239

#제출 시각아이디문제언어결과실행 시간메모리
489239dxz05Islands (IOI08_islands)C++14
90 / 100
1278 ms131076 KiB
#pragma GCC optimize("Ofast,O2,O3,unroll-loops") #pragma GCC target("avx2") #include <iostream> #include <vector> #include <bitset> #include <stack> #include <algorithm> #include <chrono> #include <random> using namespace std; #define SZ(s) ((int)s.size()) #define all(x) (x).begin(), (x).end() #define lla(x) (x).rbegin(), (x).rend() #define MP make_pair typedef long long ll; const double eps = 0.000001; const int MOD = 998244353; const int INF = 1000000101; const long long LLINF = 1223372000000000555; const int N = 1e6 + 1; const int M = 222; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); int f[N]; int w[N]; bitset<N> used; vector<int> cycle; stack<int> st; void find_cycle(int x){ while (!st.empty()) st.pop(); cycle.clear(); while (true){ st.push(x); used[x] = true; if (used[f[x]]){ while (!st.empty()){ int y = st.top(); st.pop(); cycle.push_back(y); if (y == f[x]) break; } return; } x = f[x]; } } int parent[N]; int find(int x){ return (x == parent[x] ? x : parent[x] = find(parent[x])); } vector<int> g[N]; inline int A(const int &u, const int &v){ if (f[u] == v && f[v] != u) return w[u]; if (f[u] != v && f[v] == u) return w[v]; return max(w[u], w[v]); } int X; ll D; void dfs(const int v, const int p, const ll d, int c1, int c2, const bool flag){ if (d > D) D = d, X = v; for (int u : g[v]){ if (u != p && u != c1 && u != c2) dfs(u, v, d + A(u, v), c1, c2, flag); } if (flag) g[v].clear(); } ll arr[N]; inline ll component(const int root){ find_cycle(root); const int n = cycle.size(); ll ans = 0; for (int i = 0; i < n; i++){ int v = cycle[i]; D = -1; dfs(v, v, 0, cycle[(i + n - 1) % n], cycle[(i + 1) % n], false); ans = max(ans, D); arr[v] = D; D = -1; dfs(X, X, 0, cycle[(i + n - 1) % n], cycle[(i + 1) % n], true); ans = max(ans, D); } if (n == 2){ int u = cycle[0], v = cycle[1]; ans = max(ans, arr[u] + arr[v] + A(u, v)); return ans; } vector<ll> a(n); a[0] = {arr[cycle[0]]}; ll sum = 0; for (int i = 1; i < n; i++){ sum += A(cycle[i - 1], cycle[i]); a[i] = arr[cycle[i]] + sum; } sum += A(cycle[0], cycle.back()); // for (int x : cycle) cout << x << ' '; cout << endl; // for (ll x : a) cout << x << ' '; cout << endl; ans = max(ans, arr[cycle[0]] + *max_element(a.begin() + 1, a.end())); vector<ll> sf(n, a.back()); for (int i = n - 2; i >= 0; i--) sf[i] = max(sf[i + 1], a[i]); ll add = 0; int v, u; ll mx = 0; for (int i = 1; i < n; i++){ v = cycle[i], u = cycle[i - 1]; add -= A(v, u); mx = max(mx, a[i - 1] + sum); ans = max(ans, arr[v] + add + mx); if (i + 1 < n) ans = max(ans, arr[v] + add + sf[i + 1]); mx = max(mx, a[i]); // for (int j = 1; j <= n; j++) cout << ST.get(j, j) << ' '; cout << endl; } return ans; } void solve(int TC) { int n; cin >> n; for (int i = 1; i <= n; i++) parent[i] = i; for (int i = 1; i <= n; i++){ cin >> f[i] >> w[i]; if (rng() & 1) parent[find(i)] = find(f[i]); else parent[find(f[i])] = find(i); if (f[f[i]] != i){ g[i].push_back(f[i]); g[f[i]].push_back(i); } } bitset<N> comp; ll ans = 0; for (int i = 1; i <= n; i++){ if (!comp[find(i)]){ comp[find(i)] = true; const ll cur = component(i); ans += cur; } } cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); #ifdef dddxxz freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif int TC = 1; // cin >> TC; for (int test = 1; test <= TC; test++) { //debug(test); //cout << "Case #" << test << ": "; solve(test); } return 0; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...