제출 #1046337

#제출 시각아이디문제언어결과실행 시간메모리
1046337ymmCake 3 (JOI19_cake3)C++17
100 / 100
2844 ms12456 KiB
#include <bits/stdc++.h> #define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x) #define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x) typedef long long ll; typedef std::pair<int, int> pii; typedef std::pair<ll , ll > pll; using namespace std; typedef double scal; typedef vector<scal> poly; const scal inf = 1e18; #define MAX(x, y) ((x)>(y)?(x):(y)) __attribute__((optimize("O3,unroll-loops"),target("avx2,prefer-vector-width=128"))) void fast_mul(scal *__restrict dst, const scal *__restrict src1, const scal *__restrict src2, int n, int m) { int constexpr S = 128; for (int l = 0; l < m; l += S) { int r = min(l + S, m); for (int i = 0; i < n; i++) { for (int j = l; j < r; j++) dst[i + j] = MAX(dst[i + j], src1[i] + src2[j]); } } } poly operator*(const poly &src1, const poly &src2) { poly ans(src1.size() + src2.size() - 1, -inf); fast_mul(ans.data(), src1.data(), src2.data(), src1.size(), src2.size()); return ans; } poly operator+(const poly &src1, const poly &src2) { bool swp = src1.size() < src2.size(); auto &a = swp? src2: src1; auto &b = swp? src1: src2; poly ans(a.size()); Loop (i,0,b.size()) ans[i] = MAX(a[i], b[i]); Loop (i,b.size(),a.size()) ans[i] = a[i]; return ans; } const int N = 200'010; pair<scal, scal> arr[N]; int n, M; scal ans = -inf; void solve(int l, int r, poly *pl, poly *pm, poly *pr) { if (r - l == 1) { if (pl) *pl = { -inf, arr[l].second + 2 * arr[l].first }; if (pm) *pm = { 0, arr[l].second}; if (pr) *pr = { -inf, arr[l].second - 2 * arr[l].first }; return; } int m = (l + r)/2; poly Pll, Plm, Plr; poly Prl, Prm, Prr; solve(l, m, &Pll, pr || pm? &Plm: nullptr, pr? &Plr: nullptr); solve(m, r, pl? &Prl: nullptr, pl || pm? &Prm: nullptr, &Prr); if (r - l >= M) { Loop (i,0,M+1) { if (Pll.size() > i && Prr.size() > M-i) ans = max(ans, Pll[i] + Prr[M-i]); } } if (pm) *pm = Plm * Prm; if (pl) *pl = Pll * Prm + Prl; if (pr) *pr = Prr * Plm + Plr; } int main() { cin.tie(0) -> sync_with_stdio(false); cin >> n >> M; Loop (i,0,n) { ll v, c; cin >> v >> c; arr[i].first = c; arr[i].second = v; } sort(arr, arr+n); solve(0, n, nullptr, nullptr, nullptr); cout << (ll)ans << '\n'; }

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

cake3.cpp: In function 'void solve(int, int, poly*, poly*, poly*)':
cake3.cpp:68:19: warning: comparison of integer expressions of different signedness: 'std::vector<double>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   68 |    if (Pll.size() > i && Prr.size() > M-i)
      |        ~~~~~~~~~~~^~~
cake3.cpp:68:37: warning: comparison of integer expressions of different signedness: 'std::vector<double>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   68 |    if (Pll.size() > i && Prr.size() > M-i)
      |                          ~~~~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...