제출 #1302085

#제출 시각아이디문제언어결과실행 시간메모리
1302085uranium235Nafta (COI15_nafta)C++17
34 / 100
109 ms22440 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

template <class a, class b> ostream& operator<<(ostream &l, const pair<a, b> &r) {
    l << "(" << r.first << ", " << r.second << ")";
    return l;
}

template <class t, unsigned long int s> ostream& operator<<(ostream &l, const array<t, s> &r) {
    l << "[";
    for (int i = 0; i + 1 < s; i++) l << r[i] << ", ";
    if (s > 0) l << r[s - 1];
    l << "]";
    return l;
}

template <class t> ostream& operator<<(ostream &l, const vector<t> &r) {
    l << "{";
    for (int i = 0; i + 1 < r.size(); i++) l << r[i] << ", ";
    if (!r.empty()) l << r.back();
    l << "}";
    return l;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    cin >> n >> m;

    vector<vector<int>> a(n, vector<int>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            char c;
            cin >> c;
            a[i][j] = c == '.' ? -1 : (c - '0');
        }
    }

    vector<array<int, 3>> ints;
    array<array<int, 2>, 4> del{{ {0, 1}, {0, -1}, {1, 0}, {-1, 0} }};
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] == -1) continue;

            array<int, 3> x{{ j, j, 0 }};
            queue<pair<int, int>> q;
            q.push({i, j});
            while (!q.empty()) {
                pair<int, int> p = q.front();
                q.pop();
                if (a[p.first][p.second] == -1) continue;
                x[0] = min(x[0], p.second);
                x[1] = max(x[1], p.second);
                x[2] += a[p.first][p.second];
                a[p.first][p.second] = -1;

                for (auto [dx, dy] : del) {
                    dx += p.first;
                    dy += p.second;
                    if (dx < 0 || dx >= n || dy < 0 || dy >= m) continue;

                    q.push({dx, dy});
                }
            }

            ints.push_back(x);
        }
    }
    if (n > 300) return 0;
    sort(ints.begin(), ints.end());
    vector<array<int, 3>> aux = ints;
    sort(aux.begin(), aux.end(), [](const array<int, 3> &l, const array<int, 3> &r) -> bool {
        return l[1] < r[1];
    });

    vector<vector<int>> c(m, vector<int>(m));
    for (int i = 0; i < m; i++) {
        int ptr = 0, rtp = 0, cur = 0;
        for (int j = i; j < m; j++) {
            while (ptr < ints.size() && ints[ptr][0] <= j) {
                if (ints[ptr][0] > i - 1) cur += ints[ptr][2];
                ptr++;
            }
            while (rtp < aux.size() && aux[rtp][1] < j) {
                if (aux[rtp][0] > i - 1) cur -= aux[rtp][2];
                rtp++;
            }
            c[i][j] = cur;
        }
    }


    vector<int> dp(m + 1), pd(m + 1);
    auto dnc = [&](int l, int r, int ql, int qr, auto &&self) -> void {
        int m = (l + r) / 2;
        pair<int, int> cur;
        for (int i = ql; i <= min(qr, m); i++) {
            cur = max(cur, { dp[i] + c[i][m], i });
        }
        pd[m + 1] = cur.first;
        if (l == r) return;
        self(l, m, ql, cur.second, self);
        self(m + 1, r, cur.second, qr, self);
    };
    for (int i = 0; i < m; i++) {
        fill(pd.begin(), pd.end(), 0);
        dnc(0, m - 1, 0, m - 1, dnc);
        int mx = 0;
        for (int i : pd) mx = max(mx, i);
        cout << mx << '\n';
        swap(dp, pd);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...