Submission #592942

#TimeUsernameProblemLanguageResultExecution timeMemory
592942BobaaMeetings (IOI18_meetings)C++17
Compilation error
0 ms0 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; pair<long long, long long> sc[1 << 20]; vector<int> ls, le, nxt, cnt; vector<int> H, L, R; vector<long long> ans, pl; vector<vector<int>> qu; vector<array<int, 2>> ct; set<int> sv; pair<int, int> st[1 << 21]; int vis[1 << 20]; long long getv(int i, int x) { return sc[i].first * x + sc[i].second; } void cal(int u, int l) { for (int i : qu[u]) { auto it = --sv.upper_bound(R[i]); ans[i] = min(ans[i], getv(max(ls[u], min(le[u], *it)), R[i]) + pl[u] - 1ll * H[u] * (L[i] - l)); } } void dfs(int u) { if (u == -1) return; vis[u] = 1; auto [l, r] = ct[u]; dfs(l); dfs(r); if (l != -1) { ls[u] = ls[l]; pl[u] = pl[l]; cnt[u] += cnt[l]; } sc[u] = {H[u], (l != -1 ? getv(le[l], u - 1) + pl[u] : 0) + H[u] - 1ll * u * H[u] - pl[u]}; if (r == -1) { for (int i : qu[u]) ans[i] = min(ans[i], 1ll * (R[i] - L[i] + 1) * H[u]); return; } pl[r] += 1ll * (u - ls[u] + 1) * H[u]; swap(ls[r], ls[u]); swap(le[r], le[u]); swap(pl[r], pl[r]); cal(u, ls[r]); swap(ls[r], ls[u]); swap(le[r], le[u]); swap(pl[r], pl[u]); while (nxt[u] <= le[r]) { if (getv(nxt[u], nxt[nxt[u]] - 1) + pl[r] >= getv(u, nxt[nxt[u]] - 1) + pl[u]) { sv.erase(nxt[u]); nxt[u] = nxt[nxt[u]] cnt[r]--; } else if (getv(nxt[u], nxt[u]) + pl[r] < getv(u, nxt[u]) + pl[u]) break; else { sv.erase(nxt[u]); int s = nxt[u], e = nxt[nxt[u]] - 1; while (s < e) { int m = (s + e + 1) / 2; if (getv(nxt[u], m) + pl[r] >= getv(u, m) + pl[u]) s = m; else e = m - 1; } sc[s + 1] = sc[nxt[u]]; nxt[s + 1] = nxt[nxt[u]]; if (nxt[u] == le[r]) le[r] = s + 1; sv.emplace(s + 1); nxt[u] = s + 1; break; } } if (cnt[u] < cnt[r]) { for (int i = ls[u]; i <= u; i = nxt[i]) sc[i].second += pl[u] - pl[r]; pl[u] = pl[r]; } else for (int i = nxt[u]; i <= le[r]; i = nxt[i]) sc[i].second += pl[r] - pl[u]; if (nxt[u] <= le[r]) le[u] = le[r]; cnt[u] += cnt[r]; } vector<long long> minimum_costs(vector<int> hh, vector<int> ll, vector<int> rr) { int n = hh.size(); H = hh; L = ll; R = rr; ans.resize(L.size(), 1e18); ct.resize(n, {-1, 1}); qu.resize(n); pl.resize(n); ls.resize(n); le = nxt = cnt = ls; for (int &i : nxt) i++; vector<int> pr(n), lc(n, -1), rc(n, -1); int rt = 0; for (int i = 1, lst; i < n; i++) { lst = i - 1; while (H[lst] < H[i] && lst != rt) lst = pr[lst]; if (H[lst] < H[i]) { pr[rt] = i; lc[i] = rt; rt = i; } else if (rc[lst] == -1) { rc[lst] = i; pr[i] = lst; } else { pr[rc[lst]] = i; ic[i] = rc[lst]; rc[lst] = i; pr[i] = lst; } } for (int i = 0; i < n; i++) ct[i] = {lc[i], rc[i]}; for (int tr = 0; tr < 2; tr++) { sv.clear(); for (int i = 0; i < n; i++) { sv.emplace(i); qu[i].clear(); pl[i] = 0; ls[i] = i; cnt[i] = 1; } le = nxt = ls; for (int &i : nxt) i++; memset(st, 0, sizeof(st)); for (int i = 0; i < n; i++) st[i + (1 << 20)] = {H[i], i * (tr ? 1 : -1)}; for (int i = (1 << 20) - 1; i; i--) st[i] = max(st[i * 2], st[i * 2 + 1]); auto getmx = [&](int l, int r) { l += (1 << 20); r += (1 << 20); pair<int, int> rt(0, 0); while (l <= r) { if (l % 2) { rt = max(rt, st[l]); l++; } if (r % 2 == 0) { rt = max(rt, st[r]); r--; } l /= 2; r /= 2; } return rt.second * (tr ? 1 : -1); }; for (int i = 1; i < L.size(); i++) qu[getmx(L[i], R[i])].emplace_back(i); dfs(rt); reverse(H.begin, H.end()); for (int i = 0; i < L.size(); i++) tie(L[i], R[i]) = make_pair(n - 1 - R[i], n - 1 - L[i]); rt = n - 1 - rt; for (auto &[l, r] : ct) tie(l, r) = make_pair(r == -1 ? -1 : n - 1 - r, l == -1 ? -1 : n - 1 - l); reverse(ct.begin(), ct.end()); } return ans; }

Compilation message (stderr)

meetings.cpp: In function 'void dfs(int)':
meetings.cpp:53:24: error: expected ';' before 'cnt'
   53 |    nxt[u] = nxt[nxt[u]]
      |                        ^
      |                        ;
   54 |    cnt[r]--;
      |    ~~~                  
meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:110:4: error: 'ic' was not declared in this scope; did you mean 'i'?
  110 |    ic[i] = rc[lst];
      |    ^~
      |    i
meetings.cpp:127:27: warning: 'void* memset(void*, int, size_t)' clearing an object of type 'struct std::pair<int, int>' with no trivial copy-assignment; use assignment instead [-Wclass-memaccess]
  127 |   memset(st, 0, sizeof(st));
      |                           ^
In file included from /usr/include/c++/10/bits/stl_algobase.h:64,
                 from /usr/include/c++/10/vector:60,
                 from meetings.h:3,
                 from meetings.cpp:1:
/usr/include/c++/10/bits/stl_pair.h:211:12: note: 'struct std::pair<int, int>' declared here
  211 |     struct pair
      |            ^~~~
meetings.cpp:148:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |   for (int i = 1; i < L.size(); i++) qu[getmx(L[i], R[i])].emplace_back(i);
      |                   ~~^~~~~~~~~~
meetings.cpp:150:27: error: no matching function for call to 'reverse(<unresolved overloaded function type>, std::vector<int>::iterator)'
  150 |   reverse(H.begin, H.end());
      |                           ^
In file included from /usr/include/c++/10/algorithm:62,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:65,
                 from meetings.cpp:2:
/usr/include/c++/10/bits/stl_algo.h:1165:5: note: candidate: 'void std::reverse(_BIter, _BIter) [with _BIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >]'
 1165 |     reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
      |     ^~~~~~~
/usr/include/c++/10/bits/stl_algo.h:1165:36: note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to '__gnu_cxx::__normal_iterator<int*, std::vector<int> >'
 1165 |     reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
      |             ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
In file included from /usr/include/c++/10/algorithm:74,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:65,
                 from meetings.cpp:2:
/usr/include/c++/10/pstl/glue_algorithm_defs.h:249:1: note: candidate: 'template<class _ExecutionPolicy, class _BidirectionalIterator> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void> std::reverse(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator)'
  249 | reverse(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __last);
      | ^~~~~~~
/usr/include/c++/10/pstl/glue_algorithm_defs.h:249:1: note:   template argument deduction/substitution failed:
meetings.cpp:150:27: note:   candidate expects 3 arguments, 2 provided
  150 |   reverse(H.begin, H.end());
      |                           ^
meetings.cpp:151:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  151 |   for (int i = 0; i < L.size(); i++) tie(L[i], R[i]) = make_pair(n - 1 - R[i], n - 1 - L[i]);
      |                   ~~^~~~~~~~~~