제출 #59197

#제출 시각아이디문제언어결과실행 시간메모리
59197IOrtroiiiSplit the sequence (APIO14_sequence)C++11
71 / 100
2074 ms132096 KiB
/*input 7 3 4 1 3 4 0 2 3 */ #include <bits/stdc++.h> using namespace std; #include <bits/stdc++.h> using namespace std; struct Line { long long a, b; Line(long long a = 0, long long b = 0) : a(a), b(b) {} void print() { cout << a << "x + " << b << '\n'; } }; bool bad(Line l1,Line l2,Line l3) { return (l1.b - l3.b) * (l2.a - l1.a) <= (l3.a - l1.a) * (l1.b - l2.b); } struct ConvexHullTrick { #define l1 L[L.size() - 2] #define l2 L[L.size() - 1] vector<Line> L; ConvexHullTrick() { L.clear(); } void add(Line l3) { while (L.size() >= 2 && bad(l1, l2, l3)) L.pop_back(); L.push_back(l3); } long long calc(int pos,long long x) { if (pos == L.size()) return (long long) -4e18; return L[pos].a * x + L[pos].b; } long long get(long long x) { int l = 0, r = L.size() - 1; while (l < r) { int mid = l + r >> 1; if (calc(mid, x) >= calc(mid + 1, x)) r = mid; else l = mid + 1; } return calc(l, x); } void print() { for (auto line : L) line.print(); } #undef l1 #undef l2 } cht[205]; const int N = 1e5 + 5; int n, k; long long a[N], prf[N]; long long f[205][N]; int main() { scanf("%d %d", &n, &k); for (int i = 1; i <= n; ++i) { scanf("%lld", a + i); prf[i] = prf[i - 1] + a[i]; } for (int i = 1; i <= n; ++i) f[0][i] = 0; for (int i = 1; i <= k; ++i) { cht[i - 1] = ConvexHullTrick(); cht[i - 1].add(Line()); for (int j = 1; j <= n; ++j) { f[i][j] = cht[i - 1].get(prf[j]); cht[i - 1].add(Line(prf[j], f[i - 1][j] - prf[j] * prf[j])); } } cout << f[k][n] << '\n'; vector<int> trc; int prv = n, ptr = n - 1; while (k) { if (f[k - 1][ptr] + prf[ptr] * (prf[prv] - prf[ptr]) == f[k][prv]) { prv = ptr, k--; trc.push_back(ptr); } ptr--; } reverse(trc.begin(), trc.end()); for (int pos : trc) cout << pos << ' '; }

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

sequence.cpp: In member function 'long long int ConvexHullTrick::calc(int, long long int)':
sequence.cpp:35:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (pos == L.size()) return (long long) -4e18;
       ~~~~^~~~~~~~~~~
sequence.cpp: In member function 'long long int ConvexHullTrick::get(long long int)':
sequence.cpp:42:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    int mid = l + r >> 1;
              ~~^~~
sequence.cpp: In function 'int main()':
sequence.cpp:62:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &k);
  ~~~~~^~~~~~~~~~~~~~~~~
sequence.cpp:64:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld", a + 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...
#Verdict Execution timeMemoryGrader output
Fetching results...