제출 #1231708

#제출 시각아이디문제언어결과실행 시간메모리
1231708Sir_Ahmed_Imran나일강 (IOI24_nile)C++17
100 / 100
84 ms14008 KiB
#include "nile.h" #include <bits/stdc++.h> using namespace std; #define MAXN 100001 #define nl '\n' #define ff first #define ss second #define ll long long #define ld long double #define terminator main #define pll pair<ll,ll> #define append push_back #define pii pair<int,int> #define all(x) (x).begin(),(x).end() #define L0TA ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL) ll x; int a[MAXN]; int b[MAXN]; int w[MAXN]; int l[MAXN]; int r[MAXN]; ll pre[MAXN]; ll val[MAXN]; int MIN[MAXN]; int par[MAXN]; int OMIN[MAXN]; int EMIN[MAXN]; void get(int v){ ll ans = pre[r[v]] - pre[l[v] - 1]; if((r[v] + l[v]) % 2 == 0) ans += min(MIN[v], OMIN[v]); val[v] = ans; x += val[v]; } int root(int v){ if(!par[v]) return v; par[v] = root(par[v]); return par[v]; } void join(int v, int u){ v = root(v), u = root(u); MIN[v] = min(MIN[v], MIN[u]); if((r[v] - l[v]) % 2){ OMIN[v] = min(OMIN[v], OMIN[u]); EMIN[v] = min(EMIN[v], EMIN[u]); } else{ OMIN[v] = min(OMIN[v], EMIN[u]); EMIN[v] = min(EMIN[v], OMIN[u]); } r[v] = r[u]; x -= val[v]; x -= val[u]; par[u] = v; get(v); } vector<ll> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> e){ pll p; int t, u; vector<ll> R; int n = A.size(); vector<pair<int, pii>> v; for(int i = x = 0; i < n; i++) v.append({W[i], {A[i], B[i]}}); sort(all(v)); for(int i = 0; i < n; i++){ a[i + 1] = v[i].ss.ff; b[i + 1] = v[i].ss.ss; w[i + 1] = v[i].ff; } v.clear(); for(int i = 1; i <= n; i++){ pre[i] = pre[i - 1] + b[i]; l[i] = r[i] = i; val[i] = a[i]; MIN[i] = EMIN[i] = 1e9; OMIN[i] = a[i] - b[i]; x += a[i]; if(i > 1) v.append({w[i] - w[i - 1], {i - 1, i}}); if(i > 2) v.append({w[i] - w[i - 2], {i - 1, n + 2}}); } sort(all(v)); vector<pll> ans {{0, x}}; for(auto & [i, j] : v){ if(j.ff + 1 == j.ss) join(j.ff, j.ss); else{ u = j.ff; t = root(u); if((u - l[t]) % 2) EMIN[t] = min(EMIN[t], a[u] - b[u]); else OMIN[t] = min(OMIN[t], a[u] - b[u]); MIN[t] = min(MIN[t], a[u] - b[u]); x -= val[t]; get(t); } if(ans.back().ff == i) ans.pop_back(); ans.append({i, x}); } sort(all(ans)); for(auto & d : e){ p = {d + 1, 0}; p = *(--lower_bound(all(ans), p)); R.append(p.ss); } return R; }
#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...