Submission #488930

#TimeUsernameProblemLanguageResultExecution timeMemory
488930dxz05Islands (IOI08_islands)C++14
50 / 100
751 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; stack<int> st; vector<int> cycle; void dfs0(const int v){ if (!cycle.empty()) return; used[v] = true; st.push(v); if (used[f[v]]){ while (!st.empty()){ int x = st.top(); st.pop(); cycle.push_back(x); if (x == f[v]) break; } return; } if (!cycle.empty()) return; dfs0(f[v]); if (!st.empty()) st.pop(); } int parent[N]; int find(int x){ return (x == parent[x] ? x : parent[x] = find(parent[x])); } vector<int> g[N]; int sz[N]; bitset<N> incycle; 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]); } void dfs(const int v, const int p, const ll d, const int root, vector<int> &tree, vector<ll> &dist, const bool flag){ tree.push_back(v); dist.push_back(d); for (int u : g[v]){ if (u != p){ if (u == root || !incycle[u]) dfs(u, v, d + A(u, v), root, tree, dist, flag); } } if (flag) g[v].clear(); } ll arr[N]; ll component(const int root){ cycle.clear(); while (!st.empty()) st.pop(); dfs0(root); for (int v : cycle){ incycle[v] = true; } ll ans = 0; vector<int> tree; vector<ll> dist; for (int v : cycle){ dfs(v, v, 0, v, tree, dist, false); int i = max_element(all(dist)) - dist.begin(); ans = max(ans, dist[i]); arr[v] = dist[i]; tree.clear(); dist.clear(); dfs(tree[i], tree[i], 0, v, tree, dist, true); ans = max(ans, *max_element(all(dist))); tree.clear(), dist.clear(); } const int n = cycle.size(); 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){ sz[i]++; sz[f[i]]++; g[i].emplace_back(f[i]); g[f[i]].emplace_back(i); } } for (int i = 1; i <= n; i++) g[i].reserve(sz[i]); for (int i = 1; i <= n; i++){ if (f[f[i]] != i){ g[i].emplace_back(f[i]); g[f[i]].emplace_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...