Submission #1199020

#TimeUsernameProblemLanguageResultExecution timeMemory
1199020ach00Meetings (IOI18_meetings)C++20
19 / 100
5573 ms505236 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> ST; vector<int> h; int N,n; vector<vector<ll>> dp; int L(int i) {return 2*i;} int R(int i) {return 2*i + 1;} ll query(int i, int l, int r, int a, int b) { if(l > r || r < a || l > b) return 0LL; if(a <= l && r <= b) { return ST[i]; } int m = (l+r)/2; return max(query(L(i), l, m, a, b), query(R(i), m+1, r, a, b)); } ll ask(int l, int r) { return query(1, 0, N-1, l, r); } void build(int i, int l, int r) { if(l == r) { ST[i] = h[l]; return; } int m = (l+r)/2; build(L(i), l, m); build(R(i), m+1, r); ST[i] = max(ST[L(i)], ST[R(i)]); } ll answer(int x, int i) { if(x == i) return h[x]; if(dp[x][i] != -1) return dp[x][i]; else if(x > i) { dp[x][i] = answer(x, i+1) + ask(i, x); } else { dp[x][i] = answer(x, i-1) + ask(x, i); } return dp[x][i]; } vector<ll> minimum_costs(vector<int> H, vector<int> L, vector<int> R) { h = H; N = n = H.size(); dp = vector<vector<ll>>(N+1, vector<ll>(N+1, -1)); ST.resize(4*n); build(1, 0, N-1); int Q = L.size(); vector<ll> ans(Q); for(int i = 0; i < Q; i++) { int l = L[i]; int r = R[i]; ll best = numeric_limits<ll>::max(); for(int k = l; k <= r; k++) { best = min(best, answer(k, l) + answer(k, r) - h[k]); } ans[i] = best; } 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...