# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
403410 | shenxy | 조개 줍기 (KOI17_shell) | C++11 | 2084 ms | 18016 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
typedef pair<int, int> ii;
int main() {
int N;
scanf("%d", &N);
if (N <= 100) {
int A[N][N], S[N][N];
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) scanf("%d", &A[i][j]);
}
int r, c, ans = 0;
char op;
S[0][0] = A[0][0];
for (int i = 1; i < N; ++i) S[i][0] = S[i - 1][0] + A[i][0], S[0][i] = S[0][i - 1] + A[0][i];
for (int i = 1; i < N; ++i) {
for (int j = 1; j < N; ++j) S[i][j] = max(S[i - 1][j], S[i][j - 1]) + A[i][j];
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) ans += S[i][j];
}
printf("%d\n", ans);
for (int i = 0; i < N; ++i) {
scanf(" %c %d %d", &op, &r, &c);
if (op == 'U') ++A[r - 1][c - 1];
else --A[r - 1][c - 1];
S[0][0] = A[0][0];
ans = 0;
for (int i = 1; i < N; ++i) S[i][0] = S[i - 1][0] + A[i][0], S[0][i] = S[0][i - 1] + A[0][i];
for (int i = 1; i < N; ++i) {
for (int j = 1; j < N; ++j) S[i][j] = max(S[i - 1][j], S[i][j - 1]) + A[i][j];
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) ans += S[i][j];
}
printf("%d\n", ans);
}
} else {
int A[N + 1][N + 1], S[N + 1][N + 1];
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j) scanf("%d", &A[i][j]);
}
int r[N], c[N], ans[N + 1];
char op;
for (int i = 0; i < N; ++i) scanf(" %c %d %d", &op, &r[i], &c[i]), --A[r[i]][c[i]];
for (int i = 0; i <= N; ++i) S[0][i] = S[i][0] = 0;
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j) S[i][j] = max(S[i - 1][j], S[i][j - 1]) + A[i][j];
}
ans[N] = 0;
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j) ans[N] += S[i][j];
}
for (int i = N - 1; i >= 0; --i) {
++A[r[i]][c[i]];
set<ii> pq;
pq.insert(ii(r[i], c[i]));
ans[i] = ans[i + 1];
while (!pq.empty()) {
int j = pq.begin() -> first, k = pq.begin() -> second;
pq.erase(pq.begin());
if (S[j][k] == max(S[j - 1][k], S[j][k - 1]) + A[j][k]) continue;
++ans[i];
S[j][k] = max(S[j - 1][k], S[j][k - 1]) + A[j][k];
if (j != N) pq.insert(ii(j + 1, k));
if (k != N) pq.insert(ii(j, k + 1));
}
}
for (int i = 0; i <= N; ++i) printf("%d\n", ans[i]);
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |