제출 #292095

#제출 시각아이디문제언어결과실행 시간메모리
292095SamAnd모임들 (IOI18_meetings)C++17
36 / 100
1119 ms13320 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; #define m_p make_pair #define fi first #define se second #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) typedef long long ll; const int N = 100005; int n, qq; vector<ll> solv2(vector<int> H, vector<int> L, vector<int> R) { vector<ll> v; for (int ii = 0; ii < qq; ++ii) { int l = L[ii]; int r = R[ii]; vector<ll> ans(n); for (int i = l; i <= r; ++i) ans[i] = 0; stack<pair<int, int> > s; ll yans = 0; for (int i = l; i <= r; ++i) { int q = 1; while (!s.empty() && H[i] >= s.top().fi) { yans -= s.top().fi * 1LL * s.top().se; q += s.top().se; s.pop(); } s.push(m_p(H[i], q)); yans += s.top().fi * 1LL * s.top().se; ans[i] += yans; } while (!s.empty()) s.pop(); yans = 0; for (int i = r; i >= l; --i) { int q = 1; while (!s.empty() && H[i] >= s.top().fi) { yans -= s.top().fi * 1LL * s.top().se; q += s.top().se; s.pop(); } s.push(m_p(H[i], q)); yans += s.top().fi * 1LL * s.top().se; ans[i] += yans - H[i]; } yans = ans[l]; for (int i = l; i <= r; ++i) yans = min(yans, ans[i]); v.push_back(yans); } return v; } struct ban { int l, r, ans; int q; ban() { ans = l = r = 0; q = 0; } ban(int x) { if (x == 1) { ans = l = r = 1; } else { ans = l = r = 0; } q = 1; } }; ban t[N * 4]; ban mer(const ban& l, const ban& r) { ban res; if (l.q == l.l) res.l = l.q + r.l; else res.l = l.l; if (r.q == r.r) res.r = r.q + l.r; else res.r = r.r; res.ans = max(l.ans, r.ans); res.ans = max(res.ans, l.r + r.l); res.q = l.q + r.q; return res; } void bil(const vector<int>& H, int tl, int tr, int pos) { if (tl == tr) { t[pos] = ban(H[tl]); return; } int m = (tl + tr) / 2; bil(H, tl, m, pos * 2); bil(H, m + 1, tr, pos * 2 + 1); t[pos] = mer(t[pos * 2], t[pos * 2 + 1]); } ban qry(int tl, int tr, int l, int r, int pos) { if (l > r) return ban(); if (tl == l && tr == r) return t[pos]; int m = (tl + tr) / 2; return mer(qry(tl, m, l, min(m, r), pos * 2), qry(m + 1, tr, max(m + 1, l), r, pos * 2 + 1)); } vector<ll> solv3(vector<int> H, vector<int> L, vector<int> R) { bil(H, 0, n - 1, 1); vector<ll> v; for (int ii = 0; ii < qq; ++ii) { int l = L[ii]; int r = R[ii]; ban u = qry(0, n - 1, l, r, 1); v.push_back(u.ans + (r - l + 1 - u.ans) * 2); } return v; } std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) { n = sz(H); qq = sz(L); if (n <= 5000 && qq <= 5000) return solv2(H, L, R); return solv3(H, L, 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...