Submission #571540

#TimeUsernameProblemLanguageResultExecution timeMemory
571540dennisstarMeetings (IOI18_meetings)C++17
0 / 100
63 ms25536 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; using ll = long long; vector<ll> minimum_costs(vector<int> H, vector<int> L, vector<int> R) { int n=H.size(); vector<ll> ans(L.size(), 1e18); for (int tr=0; tr<2; tr++) { vector<vector<int>> qu(n); vector<pair<int, int>> st(1<<21); for (int i=0; i<n; i++) st[i+(1<<20)]={H[i], -i}; 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; }; for (int i=0; i<L.size(); i++) qu[getmx(L[i], R[i])].emplace_back(i); vector<array<int, 2>> ct(n, {-1, -1}); 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, lc[i]=rc[lst], rc[lst]=i, pr[i]=lst; } for (int i=0; i<n; i++) ct[i]={lc[i], rc[i]}; vector<ll> pl(n); vector<deque<tuple<ll, ll, int, int>>> sc(n); auto getv = [&](tuple<ll, ll, int, int> t, int x) { auto [a, b, l, r]=t; return a*x+b; }; auto cal = [&](int u, int l) { auto calc = [&](int rb) { int s=0, e=sc[u].size()-1; while (s<e) { int m=(s+e+1)/2; if (get<2>(sc[u][m])>rb) e=m-1; else s=m; } return getv(sc[u][s], rb)+pl[u]; }; for (int i:qu[u]) { if (R[i]==u) ans[i]=min(ans[i], 1ll*(u-L[i]+1)*H[u]); else ans[i]=min(ans[i], calc(R[i])-H[u]*(L[i]-l)); } }; function<void(int)> dfs = [&](int u) { if (u==-1) return ; auto [l, r]=ct[u]; dfs(l); dfs(r); if (l!=-1) swap(sc[l], sc[u]), pl[u]=pl[l]; int lb=u; if (l!=-1) lb=get<2>(sc[u][0]); tuple<ll, ll, int, int> ins(H[u], (sc[u].size()?getv(sc[u].back(), u-1):0)+H[u]-1ll*u*H[u], u, u); if (r==-1) { sc[u].emplace_back(ins); cal(u, lb); return ; } pl[r]+=1ll*(u-(sc[u].size()?get<2>(sc[u][0]):u)+1)*H[u]; swap(sc[r], sc[u]); swap(pl[r], pl[u]); cal(u, lb); swap(sc[r], sc[u]); swap(pl[r], pl[u]); while (sc[r].size()) { if (getv(sc[r][0], get<3>(sc[r][0]))+pl[r]>=getv(ins, get<3>(sc[r][0]))+pl[u]) get<3>(ins)=get<3>(sc[r][0]), sc[r].pop_front(); else if (getv(sc[r][0], get<2>(sc[r][0]))+pl[r]<getv(ins, get<3>(sc[r][0]))+pl[u]) break; else { int s=get<2>(sc[r][0]), e=get<3>(sc[r][1]); while (s<e) { int m=(s+e+1)/2; if (getv(sc[r][0], m)+pl[r]>=getv(ins, m)+pl[u]) s=m; else e=m-1; } get<2>(sc[r][0])=s+1; get<3>(ins)=s; break; } } sc[u].emplace_back(ins); if (sc[u].size()>=sc[r].size()) for (auto &i:sc[r]) get<1>(i)+=pl[r]-pl[u], sc[u].emplace_back(i); else { reverse(sc[u].begin(), sc[u].end()); for (auto &i:sc[u]) get<1>(i)+=pl[u]-pl[r], sc[r].emplace_front(i); swap(sc[u], sc[r]); pl[u]=pl[r]; } }; 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]); } return ans; }

Compilation message (stderr)

meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:31:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |   for (int i=0; i<L.size(); i++) qu[getmx(L[i], R[i])].emplace_back(i);
      |                 ~^~~~~~~~~
meetings.cpp:117:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |   for (int i=0; i<L.size(); i++) tie(L[i], R[i])=make_pair(n-1-R[i], n-1-L[i]);
      |                 ~^~~~~~~~~
#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...