#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++) {
set<int> t {};
for (int j = 0; j < R; j++) {
if (t.count(pool[j+1][i+1]) == 0) {
t.insert(pool[j+1][i+1]);
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);
for (int i = 0; i < s; i++) {
vector<int> new_dp (s+1, -1);
calc(dp, new_dp, 1, s+1, 0, s+1);
cout << *max_element(new_dp.begin(), new_dp.end()) << "\n";
dp = new_dp;
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 |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 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 |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 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 |
10 ms |
1520 KB |
Output is correct |
8 |
Correct |
10 ms |
1400 KB |
Output is correct |
9 |
Correct |
6 ms |
1232 KB |
Output is correct |
10 |
Correct |
10 ms |
1576 KB |
Output is correct |
11 |
Correct |
7 ms |
1372 KB |
Output is correct |
12 |
Correct |
6 ms |
1372 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 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 |
10 ms |
1520 KB |
Output is correct |
8 |
Correct |
10 ms |
1400 KB |
Output is correct |
9 |
Correct |
6 ms |
1232 KB |
Output is correct |
10 |
Correct |
10 ms |
1576 KB |
Output is correct |
11 |
Correct |
7 ms |
1372 KB |
Output is correct |
12 |
Correct |
6 ms |
1372 KB |
Output is correct |
13 |
Execution timed out |
1106 ms |
43956 KB |
Time limit exceeded |
14 |
Halted |
0 ms |
0 KB |
- |