Submission #1231570

#TimeUsernameProblemLanguageResultExecution timeMemory
1231570shiocanNile (IOI24_nile)C++20
0 / 100
61 ms13496 KiB
#include <bits/stdc++.h> #include <cstdlib> #include <stdlib.h> using namespace std; #define ull unsigned long long #define ld long double #define ll long long // #define int long long #define pii pair<int, int> #define all(v) v.begin(), v.end() int mod = 1e9 + 7; const ll inf = 1e18; const int N = 1e5 + 50, K = 22; // #include "nile.h" ll n; ll sum = 0; vector<ll> c; vector<pii> q; struct dsu{ vector<ll> sz, p, minodd, mineven, minidx, altmin; ll resodd = 0, reseven = 0; dsu(int n){ sz = p = minodd = mineven = minidx = altmin = vector<ll> (n + 5, 0ll); for(int i = 0; i < n; i++) sz[i] = 1, p[i] = i, minodd[i] = mineven[i] = c[i], altmin[i] = inf, minidx[i] = i, resodd += c[i], reseven += c[i]; } ll find(ll u){ return p[u] == u ? u : p[u] = find(p[u]); } bool merge(int a, int b){ a = find(a); b = find(b); if(a == b) return false; if(sz[a] < sz[b]) swap(a, b); p[b] = a; resodd -= minodd[a]; resodd -= minodd[b]; reseven -= mineven[a]; reseven -= mineven[b]; minodd[a] = min(minodd[a], minodd[b]); mineven[a] = min(mineven[a], mineven[b]); minidx[a] = min(minidx[a], minidx[b]); altmin[a] = min(altmin[a], altmin[b]); sz[a] += sz[b]; resodd += minodd[a]; reseven += mineven[a]; return true; } ll get(ll a){ a = find(a); if(sz[a] % 2){ if(minidx[a] % 2) return min(resodd, altmin[a]); else return min(reseven, altmin[a]); } return 0; } }; struct item{ ll w, a, b; }; vector<long long> calculate_costs(vector<int> w, vector<int> a, vector<int> b, vector<int> e){ n = a.size(); c = vector<ll> (n, 0ll); vector<ll> ans((ll)e.size()); for(auto i : b) sum += i; // ans = sum + cost(i) vector<item> arr(n); for(int i = 0; i < n; i++) arr[i] = {w[i], a[i], b[i]}; sort(all(arr), [](item x, item y){ return x.w < y.w; }); // cout << "arr: \n"; // for(auto i : arr) // cout << i.w << ' ' << i.a << ' ' << i.b << '\n'; // cout << '\n'; for(int i = 0; i < n; i++) c[i] = arr[i].a - arr[i].b; // cout << "c: \n"; // for(auto i : c) // cout << i << ' '; // cout << '\n'; for(int i = 0; i < e.size(); i++) q.push_back({e[i], i}); sort(all(q)); // cout << "q: \n"; // for(auto i : q) // cout << i.first << ' ' << i.second << '\n'; // cout << '\n'; vector<pii> p; for(int i = 0; i < n - 1; i++){ p.push_back({i, i + 1}); if(i + 2 < n) p.push_back({i, i + 2}); } sort(all(p), [&](pii x, pii y){ return arr[x.second].w - arr[x.first].w < arr[y.second].w - arr[y.first].w; }); // cout << "p: \n"; // for(auto i : p) // cout << arr[i.second].w - arr[i.first].w << ' ' << arr[i.first].w << ' ' << arr[i.second].w << ' ' << i.first << ' ' << i.second << '\n'; // cout << '\n'; dsu ds(n); int i = 0; for(auto [d, idx] : q){ while(i < p.size() && arr[p[i].second].w - arr[p[i].first].w <= d){ ds.merge(p[i].first, p[i].second); if(p[i].second - p[i].first == 2){ ll x = ds.find(p[i].first + 1); // ds.altmin[x] = min(ds.altmin[x], c[p[i].first + 1]); } i++; } for(auto k : ds.altmin) cout << (k == inf ? -1 : k) << ' '; cout << '\n'; ans[idx] = sum + ds.get(p[0].first); } // for(int i = 0; i < n; i++) // cout << ds.get(i) << ' '; // cout << '\n'; // ds.merge(1, 2); // ds.merge(2, 3); // // ds.merge(3, 4); // // ds.merge(0, 1); // for(int i = 0; i < n; i++) // cout << ds.get(i) << ' '; // cout << '\n'; /* */ return ans; }
#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...