Submission #951827

#TimeUsernameProblemLanguageResultExecution timeMemory
951827EJIC_B_KEDAXColouring a rectangle (eJOI19_colouring)C++17
50 / 100
2062 ms31876 KiB
#include <bits/stdc++.h>
#include <random>
 
#ifndef LOCAL
    //#pragma GCC optimize("O3")
    //#pragma GCC optimize("Ofast")
    //#pragma GCC optimize("unroll-loops")
    //#pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt")
#endif
using namespace std;
using ll = long long;
using dd = double;
using ld = long double;
using uii = unsigned int;
#define x first
#define y second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
 
 
void solve();
 
mt19937_64 mt(373);
 
int32_t main() {
#ifdef LOCAL
    freopen("input.in", "r", stdin);
    freopen("output.out", "w", stdout);
#else
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    //freopen("amusing.in", "r", stdin);
    //freopen("amusing.out", "w", stdout);
#endif
    cout << fixed << setprecision(30);
    int tests = 1;
    //cin >> tests;
    while (tests--) {
        solve();
    }
}
 
#define int ll
 
ll get_seg(int l, int r, vector<ll>& pref) {
    if (l > r) {
        return 0;
    }
    return pref[r + 1] - pref[l];
}
 
ll get_seg(pair<int, int>& a, vector<ll>& pref) {
    return pref[a.y + 1] - pref[a.x];
}
 
void solve() {
    int n, m;
    cin >> n >> m;
    vector<int> a[2], b[2];
    for (int i = 0; i < n + m - 1; i++) {
        int c;
        cin >> c;
        b[(m - 1 + i) % 2].push_back(c);
    }
    for (int i = 0; i < n + m - 1; i++) {
        int c;
        cin >> c;
        a[i % 2].push_back(c);
    }
    if (n == 1 && m == 1) {
        cout << min(a[0][0], b[0][0]) << '\n';
        return;
    }
    int sz[2] = {(int)a[0].size(), (int)a[1].size()};
    vector<pair<int, int>> seg[2];
    seg[0].resize(sz[0]);
    seg[1].resize(sz[1]);
    seg[0][0] = {(m - 1) / 2, (m - 1) / 2};
    seg[1][0] = {(m - 2) / 2, m / 2};
    for (int i = 1; i < sz[0]; i++) {
        seg[0][i].x = max((2 * i - m + 1) / 2, seg[0][i - 1].x - 1);
        seg[0][i].y = min((int)b[0].size() - (2 * i - n + 1) / 2 - 1, seg[0][i - 1].y + 1);
    }
    for (int i = 1; i < sz[1]; i++) {
        seg[1][i].x = max((2 * i - m + 2) / 2, seg[1][i - 1].x - 1);
        seg[1][i].y = min((int)b[1].size() - (2 * i - n + 2) / 2 - 1, seg[1][i - 1].y + 1);
    }
    seg[0].emplace_back(0, -1);
    seg[1].emplace_back(0, -1);
    vector<ll> dp[2], pref[2];
    dp[0].resize(sz[0]);
    dp[1].resize(sz[1]);
    pref[0].resize(b[0].size() + 1);
    pref[1].resize(b[1].size() + 1);
    pref[0][0] = 0;
    pref[1][0] = 0;
    for (int i = 0; i < b[0].size(); i++) {
        pref[0][i + 1] = pref[0][i] + b[0][i];
    }
    for (int i = 0; i < b[1].size(); i++) {
        pref[1][i + 1] = pref[1][i] + b[1][i];
    }
//    dp[0][0] = min(get_seg(seg[0][0], pref[0]), (ll) a[0][0]);
//    dp[1][0] = min(get_seg(seg[1][0], pref[1]), (ll) a[1][0]);
    for (int i = 0; i < sz[0]; i++) {
        dp[0][i] = INT64_MAX;
        ll sm = 0;
        int l1 = seg[0][i + 1].x, r1 = seg[0][i + 1].y;
        for (int j = i; j >= 0; j--) {
            if (j > 0) {
                dp[0][i] = min(dp[0][i], sm + get_seg(seg[0][j], pref[0]) - get_seg(max(l1, seg[0][j].x), min(r1, seg[0][j].y), pref[0]) + dp[0][j - 1]);
            } else {
                dp[0][i] = min(dp[0][i], sm + get_seg(seg[0][j], pref[0]) - get_seg(max(l1, seg[0][j].x), min(r1, seg[0][j].y), pref[0]));
            }
            sm += a[0][j];
        }
        dp[0][i] = min(dp[0][i], sm);
        int l = INT32_MAX, r = INT32_MIN;
        for (int j = i; j >= 0; j--) {
            l = min(l, seg[0][j].x);
            r = max(r, seg[0][j].y);
            if (j > 0) {
                dp[0][i] = min(dp[0][i], get_seg(l, r, pref[0]) - get_seg(max(l1, l), min(r1, r), pref[0]) + dp[0][j - 1]);
            } else {
                dp[0][i] = min(dp[0][i], get_seg(l, r, pref[0]) - get_seg(max(l1, l), min(r1, r), pref[0]));
            }
        }
    }
    for (int i = 0; i < sz[1]; i++) {
        dp[1][i] = INT64_MAX;
        ll sm = 0;
        int l1 = seg[1][i + 1].x, r1 = seg[1][i + 1].y;
        for (int j = i; j >= 0; j--) {
            if (j > 0) {
                dp[1][i] = min(dp[1][i], sm + get_seg(seg[1][j], pref[1]) - get_seg(max(l1, seg[1][j].x), min(r1, seg[1][j].y), pref[1]) + dp[1][j - 1]);
            } else {
                dp[1][i] = min(dp[1][i], sm + get_seg(seg[1][j], pref[1]) - get_seg(max(l1, seg[1][j].x), min(r1, seg[1][j].y), pref[1]));
            }
            sm += a[1][j];
        }
        dp[1][i] = min(dp[1][i], sm);
        int l = INT32_MAX, r = INT32_MIN;
        for (int j = i; j >= 0; j--) {
            l = min(l, seg[1][j].x);
            r = max(r, seg[1][j].y);
            if (j > 0) {
                dp[1][i] = min(dp[1][i], get_seg(l, r, pref[1]) - get_seg(max(l1, l), min(r1, r), pref[1]) + dp[1][j - 1]);
            } else {
                dp[1][i] = min(dp[1][i], get_seg(l, r, pref[1]) - get_seg(max(l1, l), min(r1, r), pref[1]));
            }
        }
    }
    cout << dp[0].back() + dp[1].back() << '\n';
}

Compilation message (stderr)

colouring.cpp: In function 'void solve()':
colouring.cpp:97:23: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |     for (int i = 0; i < b[0].size(); i++) {
      |                     ~~^~~~~~~~~~~~~
colouring.cpp:100:23: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |     for (int i = 0; i < b[1].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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...