답안 #1054726

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1054726 2024-08-12T11:47:36 Z anonymous321 Nafta (COI15_nafta) C++17
11 / 100
10 ms 2736 KB
#include <bits/stdc++.h>
using namespace std;
typedef vector<vector<bool>> vvb;
const int INF = numeric_limits<int>::max()/2;

int R;
vector<int> oil {0};
vector<int> min_p {0};
vector<vector<int>> pool;
vector<vector<pair<int, int>>> pools;

void calc (vector<int> &dp, vector<int> &new_dp, int l, int r, int optl, int optr) {
    if (l >= r) return;
    if (optl >= optr) abort();
    int mid = (l + r) / 2;
    int opt = -1;
    int delta = 0;
    int id = 0;
    for (int i = min(mid, optr-1); i >= optl; i--) {
        while (id < pools[mid-1].size() && pools[mid-1][id].first > i) {
            delta += oil[pools[mid-1][id].second];
            id++;
        }
        if (new_dp[mid] < dp[i] + delta) {
            new_dp[mid] = dp[i] + delta;
            opt = i;
        }
    }
    if (opt == -1) abort();
    calc(dp, new_dp, l, mid, optl, opt+1);
    calc(dp, new_dp, mid+1, r, opt, optr);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int r, s;
    cin >> r >> s;
    R = r;
    vector<vector<int>> m (r+2, vector<int>(s+2, -1));
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < s; j++) {
            char c;
            cin >> c;
            if (c != '.') {
                m[i+1][j+1] = c - '0';
            }
        }
    }
    
    int cnt = 1;
    pool = vector<vector<int>>(r+2, vector<int>(s+2, 0));
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < s; j++) {
            if (m[i+1][j+1] != -1 && pool[i+1][j+1] == 0) {
                int cur = cnt++;
                pool[i+1][j+1] = cur;
                oil.push_back(0);
                min_p.push_back(j+1);
                queue<pair<int, int>> q {};
                q.push({i+1, j+1});
                while (!q.empty()) {
                    auto[x, y] = q.front();
                    q.pop();
                    oil[cur] += m[x][y];
                    min_p[cur] = min(min_p[cur], y);
                    vector<pair<int, int>> nb {{x, y-1}, {x, y+1}, {x-1, y}, {x+1, y}};
                    for (auto[itx, ity] : nb) {
                        if (m[itx][ity] != -1 && pool[itx][ity] == 0) {
                            pool[itx][ity] = cur;
                            q.push({itx, ity});
                        }
                    }
                }
            }
        }
    }

    pools = vector<vector<pair<int, int>>> (s);
    for (int i = 0; i < s; i++) {
        vector<bool> t (cnt, false);
        for (int j = 0; j < R; j++) {
            if (!t[pool[j+1][i+1]]) {
                t[pool[j+1][i+1]] = true;
                pools[i].push_back({min_p[pool[j+1][i+1]], pool[j+1][i+1]});
            }
        }
        sort(pools[i].rbegin(), pools[i].rend());
    }
    

    vector<int> dp (s+1, 0);
    vector<int> new_dp = dp;
    for (int i = 0; i < s; i++) {
        calc(dp, new_dp, 1, s+1, 0, s+1);
        cout << *max_element(new_dp.begin(), new_dp.end()) << "\n";
        swap(dp, new_dp);
        new_dp.assign(s+1, -1);
        new_dp[0] = 0;
    }
    return 0;
}

Compilation message

nafta.cpp: In function 'void calc(std::vector<int>&, std::vector<int>&, int, int, int, int)':
nafta.cpp:20:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |         while (id < pools[mid-1].size() && pools[mid-1][id].first > i) {
      |                ~~~^~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 9 ms 1372 KB Output is correct
8 Correct 10 ms 1372 KB Output is correct
9 Correct 6 ms 1188 KB Output is correct
10 Correct 9 ms 1372 KB Output is correct
11 Correct 6 ms 1372 KB Output is correct
12 Runtime error 3 ms 2736 KB Execution killed with signal 6
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 9 ms 1372 KB Output is correct
8 Correct 10 ms 1372 KB Output is correct
9 Correct 6 ms 1188 KB Output is correct
10 Correct 9 ms 1372 KB Output is correct
11 Correct 6 ms 1372 KB Output is correct
12 Runtime error 3 ms 2736 KB Execution killed with signal 6
13 Halted 0 ms 0 KB -