Submission #1190023

#TimeUsernameProblemLanguageResultExecution timeMemory
1190023epicci23Nile (IOI24_nile)C++20
100 / 100
87 ms20788 KiB
#include "bits/stdc++.h" #include "nile.h" #define ll long long #define sz(v) (ll) v.size() #define all(v) v.begin(),v.end() using namespace std; const ll N = 1e5 + 5; const ll INF = 1e18; ll par[N], siz[N], tot, ans[N], mini[N][2] ,L[N], bsum[N], acik[N]; vector<array<ll,3>> ar; ll find(ll a){ if(par[a] == a) return a; return par[a] = find(par[a]); } void unite(ll a,ll b){ //cout << "birles : " << a << ' ' << b << '\n'; if(a + 2 == b){ acik[find(a)] = min(acik[find(a)], ar[a + 1][2] - ar[a + 1][1]); if(siz[find(a)] % 2){ tot -= ans[find(a)]; ans[find(a)] = min(ans[find(a)], bsum[find(a)] + acik[find(a)]); tot += ans[find(a)]; } //cout << "new cost : " << ans[a] << '\n'; return; } a=find(a),b=find(b); if(a==b) return; if(siz[a] < siz[b]) swap(a, b); par[b] = a; siz[a] += siz[b]; L[a] = min(L[a], L[b]); tot -= (ans[a] + ans[b]); ans[a] += ans[b]; acik[a] = min(acik[a], acik[b]); for(int i=0;i<2;i++) mini[a][i] = min(mini[a][i], mini[b][i]); bsum[a] += bsum[b]; //cout << "old cost : " << ans[a] << '\n'; if(siz[a] % 2){ //cout << "wtf1 : " << bsum[a] + mini[a][L[a]&1] << '\n'; //cout << "wtf2 : " << bsum[a] + acik[a] << '\n'; ans[a] = min(ans[a], bsum[a] + mini[a][L[a]&1]); ans[a] = min(ans[a], bsum[a] + acik[a]); } else{ ans[a] = min(ans[a], bsum[a]); } // cout << "new cost : " << ans[a] << '\n'; tot += ans[a]; } vector<ll> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E){ ll n = sz(W); ar.clear(); for(ll i=0;i<n;i++){ ll a = W[i], b = B[i], c = A[i]; ar.push_back({a, b, c}); } sort(all(ar)); ll q = sz(E); vector<ll> Res(q, 0); vector<array<ll,2>> que; for(ll i=0;i<q;i++){ ll a = E[i]; que.push_back({a, i}); } sort(all(que)); tot = 0; for(ll i=0;i<n;i++){ L[i] = par[i] = i; acik[i] = INF; siz[i] = 1; mini[i][i&1] = ar[i][2] - ar[i][1]; mini[i][!(i&1)] = INF; bsum[i] = ar[i][1]; ans[i] = ar[i][2]; tot += ans[i]; } vector<array<ll,3>> Merge; for(ll i=1;i<n;i++) Merge.push_back({ar[i][0] - ar[i - 1][0], 0, i - 1}); for(ll i=1;i+1<n;i++) Merge.push_back({ar[i+1][0] - ar[i-1][0], 1, i - 1}); sort(all(Merge)); ll ptr = 0; for(array<ll,2> x : que){ while(ptr < sz(Merge) && Merge[ptr][0] <= x[0]){ if(Merge[ptr][1] == 0) unite(Merge[ptr][2] , Merge[ptr][2] + 1); else unite(Merge[ptr][2], Merge[ptr][2] + 2); ptr++; } Res[x[1]] = tot; } return Res; } /*void _(){ int n; cin >> n; for(int i=0;i<n;i++){ int a,b,c; cin >> a >> b >> c; ar.push_back({a, c, b}); } sort(all(ar)); int q; cin >> q; vector<ll> Res(q, 0); vector<array<ll,2>> que; for(int i=0;i<q;i++){ int a; cin >> a; que.push_back({a, i}); } sort(all(que)); tot = 0; for(ll i=0;i<n;i++){ L[i] = par[i] = i; acik[i] = INF; siz[i] = 1; mini[i][i&1] = (ar[i][2] - ar[i][1]); mini[i][!(i&1)] = INF; bsum[i] = ar[i][1]; ans[i] = ar[i][2]; tot += ans[i]; } vector<array<ll,3>> Merge; for(ll i=1;i<n;i++) Merge.push_back({ar[i][0] - ar[i - 1][0], 0, i - 1}); for(ll i=1;i+1<n;i++) Merge.push_back({ar[i+1][0] - ar[i-1][0], 1, i - 1}); sort(all(Merge)); ll ptr = 0; for(array<ll,2> x : que){ while(ptr < sz(Merge) && Merge[ptr][0] <= x[0]){ if(Merge[ptr][1] == 0) unite(Merge[ptr][2] , Merge[ptr][2] + 1); else unite(Merge[ptr][2], Merge[ptr][2] + 2); ptr++; } Res[x[1]] = tot; } for(int i=0;i<q;i++){ cout << Res[i] << '\n'; } } int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); int tc=1;//cin >> tc; while(tc--) _(); }*/
#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...