(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

제출 #120908

#제출 시각아이디문제언어결과실행 시간메모리
120908sebinkim모임들 (IOI18_meetings)C++14
100 / 100
2011 ms325512 KiB
#include "meetings.h" #include <vector> #include <algorithm> using namespace std; typedef long long ll; typedef pair <int, int> pii; struct minseg{ pii T[2202020]; int sz = 1 << 20; void init(vector <int> &H) { int i; for(i=0; i<H.size(); i++){ T[i + sz] = pii(H[i], i); } for(i=sz-1; i; i--){ T[i] = max(T[i << 1], T[i << 1 | 1]); } } int getmax(int l, int r) { pii ret(-1, -1); l += sz; r += sz; for(; l<=r; ){ if(l & 1) ret = max(ret, T[l]); if(~r & 1) ret = max(ret, T[r]); l = l + 1 >> 1; r = r - 1 >> 1; } return ret.second; } }; struct line{ ll x, a, b; line() {} line(ll x, ll a, ll b) : x(x), a(a), b(b) {} }; struct deq{ line D[808080]; int S[808080], E[808080]; ll V[808080]; int n; bool t; void init(bool _t, int _n) { int i; t = _t; n = _n; for(i=0; i<n; i++){ S[i] = i; E[i] = i; D[i] = line(i, 0, 0); } } void addval(int p, ll v) { if(t) p = n - 1 - p; V[p] += v; } void addline(int p, ll x, ll a, ll b) { if(t){ p = n - 1 - p, x = n - 1 - x; b = (n - 1) * a + b; a = -a; } int &s = S[p], &e = E[p]; b -= V[p]; for(; s<=e; e--){ if(D[e].a == a && D[e].b < b) return; if(D[e].a * D[e].x + D[e].b < a * D[e].x + b){ D[++e] = line((D[e].b - b) / (a - D[e].a) + 1, a, b); return; } } D[++e] = line(x, a, b); } ll getval(int p, ll x) { if(t) p = n - 1 - p, x = n - 1 - x; int k = upper_bound(D + S[p], D + E[p] + 1, x, [&](ll x, line l){ return x < l.x; }) - D - 1; return D[k].a * x + D[k].b + V[p]; } void merge(int p, int q) { if(t) p = n - 1 - p, q = n - 1 - q; int i; if(E[p] - S[p] < E[q] - S[q]){ swap(S[p], S[q]); swap(E[p], E[q]); swap(V[p], V[q]); } if(S[p] < S[q]){ for(i=S[q]; i<=E[q]; i++){ D[i].b += V[q] - V[p]; D[++E[p]] = D[i]; } } else{ for(i=E[q]; i>=S[q]; i--){ D[i].b += V[q] - V[p]; D[--S[p]] = D[i]; } } } }; minseg T; deq DL, DR; vector <int> H, L, R; vector <int> Q[808080]; vector <ll> A; int n; int dnc(int s, int e) { if(s > e) return -1; int m, l, r; ll v, h; m = T.getmax(s, e); h = H[m]; l = dnc(s, m - 1); r = dnc(m + 1, e); for(int &q: Q[m]){ if(L[q] == m && R[q] == m) A[q] = h; else if(L[q] == m) A[q] = DR.getval(r, R[q]) + h; else if(R[q] == m) A[q] = DL.getval(l, L[q]) + h; else A[q] = min(DL.getval(l, L[q]) + h * (R[q] - m + 1), DR.getval(r, R[q]) + h * (m - L[q] + 1)); } if(l != -1) DL.merge(m, l); DL.addval(m, h * (e - m + 1)); DL.addline(m, s, -h, (r != -1? DL.getval(r, m + 1) : 0) + h * (m + 1)); if(r != -1) DL.merge(m, r); if(r != -1) DR.merge(m, r); DR.addval(m, h * (m - s + 1)); DR.addline(m, e, h, (l != -1? DR.getval(l, m - 1) : 0) - h * (m - 1)); if(l != -1) DR.merge(m, l); return m; } vector <ll> minimum_costs(vector <int> _H, vector <int> _L, vector <int> _R) { int i; swap(H, _H); swap(L, _L); swap(R, _R); n = H.size(); A.resize(L.size()); T.init(H); DL.init(0, n); DR.init(1, n); for(i=0; i<L.size(); i++){ Q[T.getmax(L[i], R[i])].push_back(i); } dnc(0, n - 1); return A; }

컴파일 시 표준 에러 (stderr) 메시지

meetings.cpp: In member function 'void minseg::init(std::vector<int>&)':
meetings.cpp:19:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(i=0; i<H.size(); i++){
            ~^~~~~~~~~
meetings.cpp: In member function 'int minseg::getmax(int, int)':
meetings.cpp:36:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    l = l + 1 >> 1;
        ~~^~~
meetings.cpp:37:10: warning: suggest parentheses around '-' inside '>>' [-Wparentheses]
    r = r - 1 >> 1;
        ~~^~~
meetings.cpp: In member function 'void deq::addline(int, ll, ll, ll)':
meetings.cpp:89:7: warning: operation on 'e' may be undefined [-Wsequence-point]
     D[++e] = line((D[e].b - b) / (a - D[e].a) + 1, a, b);
       ^~~
meetings.cpp:89:7: warning: operation on 'e' may be undefined [-Wsequence-point]
meetings.cpp: In function 'int dnc(int, int)':
meetings.cpp:146:5: warning: unused variable 'v' [-Wunused-variable]
  ll v, h;
     ^
meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:181:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0; i<L.size(); 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...