Submission #1242076

#TimeUsernameProblemLanguageResultExecution timeMemory
1242076mychecksedadNile (IOI24_nile)C++20
100 / 100
145 ms21944 KiB
#include "nile.h" #include <bits/stdc++.h> using namespace std; #define vi vector<int> #define pb push_back #define pii pair<int,int> #define ff first #define ss second #define cerr if(0) cerr #define all(x) x.begin(),x.end() #define ll long long int const int N = 1e5+100; int _n; ll T[N*2], T2[2*N]; void build(int n){ _n = n; for(int j = 0; j <= 2*n+2; ++j) T[j] = T2[j] = 1e18; } void upd(int p, ll val){ ++p; if(p&1){ T[p += _n] = val; for(p >>= 1; p; p >>= 1) T[p] = min(T[p<<1], T[p<<1|1]); }else{ T2[p += _n] = val; for(p >>= 1; p; p >>= 1) T2[p] = min(T2[p<<1], T2[p<<1|1]); } } void upd2(int p, ll val){ ++p; if(!(p&1)){ T[p += _n] = val; for(p >>= 1; p; p >>= 1) T[p] = min(T[p<<1], T[p<<1|1]); }else{ T2[p += _n] = val; for(p >>= 1; p; p >>= 1) T2[p] = min(T2[p<<1], T2[p<<1|1]); } } ll get(int l, int r){ if(l > r) return 1e18; ll res = 1e18; ++l, ++r; if(l&1){ l += _n; r += _n + 1; for(; l < r; l >>= 1, r >>= 1){ if(l&1) res = min(res, T[l++]); if(r&1) res = min(res, T[--r]); } }else{ l += _n; r += _n + 1; for(; l < r; l >>= 1, r >>= 1){ if(l&1) res = min(res, T2[l++]); if(r&1) res = min(res, T2[--r]); } } return res; } std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) { int q = (int) E.size(); int n = (int) W.size(); build(n); vector<array<ll, 3>> C; for(int i = 0; i < n; ++i) C.pb({W[i], A[i], B[i]}); sort(all(C)); vector<ll> pref(n); ll sum = 0; for(int i = 0; i < n; ++i) sum += C[i][1]; pref[0] = C[0][1] - C[0][2]; for(int i = 1; i < n; ++i) pref[i] = pref[i - 1] + C[i][1] - C[i][2]; for(int i = 0; i < n; ++i) upd(i, C[i][1] - C[i][2]); // for(int i = 0; i < n; ++i) cerr << pref[i] << ' '; // cerr << " wtf\n"; function<ll(int, int)> get2 = [&](int l, int r){ if(l == r) return 0ll; if((r-l) % 2){ return pref[r] - (l <= 0 ? 0 : pref[l - 1]); } ll summ = pref[r] - (l <= 0 ? 0 : pref[l - 1]); return summ - get(l, r); }; vector<ll> res(q); vector<pair<ll, int>> Q; for(int i = 0; i < q; ++i) Q.pb({E[i], i}); sort(all(Q)); set<array<int, 2>> S; for(int i = 0; i < n; ++i) S.insert({i, i}); vector<pair<ll, ll>> dif; vector<pair<ll, ll>> adj; for(int i = 1; i < n; ++i) dif.pb({C[i][0] - C[i - 1][0], i}); for(int i = 1; i + 1 < n; ++i) adj.pb({C[i + 1][0] - C[i - 1][0], i}); sort(all(dif)); sort(all(adj)); int ptr = 0; int ptr2 = 0; ll ans = 0; for(auto [D, idx]: Q){ cerr << D << ":\n"; while(ptr2 + 2 < n && adj[ptr2].ff <= D){ int pt = adj[ptr2].ss; auto it = S.lower_bound(array<int, 2>{pt + 1, -1}); --it; ans -= get2((*it)[0], (*it)[1]); upd2(pt, C[pt][1] - C[pt][2]); ans += get2((*it)[0], (*it)[1]); cerr << pt << ' '; ptr2++; } cerr << '\n'; while(ptr + 1 < n && dif[ptr].ff <= D){ int pt = dif[ptr].ss; // cerr << pt << ' '; auto it = S.lower_bound(array<int, 2>{pt, -1}); ans -= get2((*it)[0], (*it)[1]); ans -= get2((*prev(it))[0], (*prev(it))[1]); int L = (*prev(it))[0]; int R = (*it)[1]; S.erase(prev(it)); it = S.lower_bound(array<int, 2>{pt, -1}); S.erase(it); S.insert({L, R}); // cerr << L << ' ' << R << ' ' << get2(L, R) << " ff\n"; ans += get2(L, R); ++ptr; } cerr << '\n'; cerr << ans << '\n'; cerr << "S:\n"; res[idx] = sum - ans; } return res; }
#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...