Submission #1056640

#TimeUsernameProblemLanguageResultExecution timeMemory
1056640aykhnCatfish Farm (IOI22_fish)C++17
35 / 100
1105 ms713300 KiB
#include "fish.h" #include <bits/stdc++.h> using namespace std; const int MXN = 3e3 + 5; long long dp[2][MXN][MXN], val[MXN][MXN]; long long lft[MXN][MXN], rig[MXN][MXN], in[MXN][MXN]; long long pre[2][MXN][MXN], suf[2][MXN][MXN]; long long mx[MXN]; /* 0 = len[i] < len[i + 1]; 1 = len[i] > len[i + 1]; */ long long max_weights(int N, int M, vector<int> X, vector<int> Y, vector<int> W) { #define int long long for (int i = 0; i < M; i++) val[X[i] + 1][Y[i] + 1] = 1LL * val[X[i] + 1][Y[i] + 1] + 1LL * W[i]; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { lft[i][j] = lft[i][j - 1] + val[i - 1][j]; rig[i][j] = rig[i][j - 1] + val[i + 1][j]; in[i][j] = in[i][j - 1] + val[i][j]; } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { dp[0][i][j] = dp[1][i][j] = lft[i][j] + rig[i][j]; if (i <= 1) continue; dp[0][i][j] = max(dp[0][i][j], pre[0][i - 1][j] + (lft[i][j] + rig[i][j])); dp[1][i][j] = max(dp[1][i][j], suf[0][i - 1][j] + (rig[i][j] - in[i][j])); // for (int k = 1; k <= N; k++) // { // if (k <= j) // { // long long res = (dp[0][i - 1][k] - rig[i - 1][k] - in[i - 1][k]) + (lft[i][j] + rig[i][j]); // dp[0][i][j] = max(dp[0][i][j], res); // } // if (k >= j) // { // long long res = (dp[1][i - 1][k]) + (rig[i][j] - in[i][j]); // dp[1][i][j] = max(dp[1][i][j], res); // } // } if (i <= 2) continue; long long A = pre[1][i - 2][j] + lft[i][j] + rig[i][j]; long long B = suf[1][i - 2][j] + rig[i][j]; dp[0][i][j] = max({dp[0][i][j], A, B}); dp[1][i][j] = max({dp[1][i][j], A, B}); // for (int k = 1; k <= N; k++) // { // long long res = 0; // if (k <= j) // { // res = (max(dp[0][i - 2][k], dp[1][i - 2][k]) - rig[i - 2][k]) + lft[i][j] + rig[i][j]; // } // if (k >= j) // { // res = max(dp[0][i - 2][k], dp[1][i - 2][k]) + rig[i][j]; // } // dp[0][i][j] = max(dp[0][i][j], res); // dp[1][i][j] = max(dp[1][i][j], res); // } if (i <= 3) continue; dp[0][i][j] = max(dp[0][i][j], mx[i - 3] + lft[i][j] + rig[i][j]); dp[1][i][j] = max(dp[1][i][j], mx[i - 3] + lft[i][j] + rig[i][j]); } for (int j = 1; j <= N; j++) { pre[0][i][j] = max(pre[0][i][j - 1], dp[0][i][j] - rig[i][j] - in[i][j]); pre[1][i][j] = max(pre[1][i][j - 1], max(dp[0][i][j], dp[1][i][j]) - rig[i][j]); } for (int j = N; j >= 1; j--) { suf[0][i][j] = max(suf[0][i][j + 1], dp[1][i][j]); suf[1][i][j] = max(suf[1][i][j + 1], max(dp[0][i][j], dp[1][i][j])); } for (int j = 1; j <= N; j++) { mx[i] = max({mx[i], dp[0][i][j], dp[1][i][j]}); } } long long ans = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { ans = max({ans, dp[0][i][j], dp[1][i][j]}); } } return ans; #undef int }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...