Submission #705205

#TimeUsernameProblemLanguageResultExecution timeMemory
705205danikoynovCatfish Farm (IOI22_fish)C++17
9 / 100
136 ms14216 KiB
#include "fish.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e5 + 10, smalln = 3010; vector < pair < int, int > > col[maxn]; ll dp[smalln][smalln][2]; ll val[smalln][smalln], pref[smalln][smalln]; ll get_sum(int col, int left, int right) { ll sum = pref[col][right]; if (left > 0) sum = sum - pref[col][left - 1]; return sum; } long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) { bool all_even = true, small_x = true; for (int i = 0; i < M; i ++) { if (X[i] % 2 != 0) all_even = false; if (X[i] > 1) small_x = false; } for (int i = 0; i < M; i ++) { col[X[i]].push_back({Y[i], W[i]}); } for (int i = 0; i < N; i ++) sort(col[i].begin(), col[i].end()); if (all_even) { ll sum = 0; for (int i = 0; i < M; i ++) sum = sum + W[i]; return sum; } else if (small_x) { ll zero = 0, one = 0; for (int i = 0; i < M; i ++) { if (X[i] == 0) zero += W[i]; else one += W[i]; } if (N == 2) return max(zero, one); int to = 0; ll cur = 0, ans = 0; for (int i = 0; i < col[0].size(); i ++) { if (cur + one > ans) ans = cur + one; cur += col[0][i].second; while(to < col[1].size() && col[1][to].first <= col[0][i].first) { one -= col[1][to].second; to ++; } } if (cur + one > ans) ans = cur + one; return ans; } for (int i = 0; i < M; i ++) val[X[i]][Y[i]] = W[i]; /**for (int i = 0; i < N; i ++, cout << endl) for (int j = 0; j < N; j ++) cout << val[i][j] << " ";*/ for (int j = 0; j <= N; j ++) dp[1][j][0] = dp[1][j][1] = 0; for (int i = 0; i < N; i ++) { pref[i][0] = val[i][0]; for (int j = 1; j <= N; j ++) { pref[i][j] = pref[i][j - 1] + val[i][j]; } } for (int i = 1; i < N; i ++) { dp[i][0][1] = dp[i - 1][0][1]; for (int j = 1; j <= N; j ++) { dp[i][j][1] = max(dp[i][j - 1][1] + val[i - 1][j - 1], dp[i - 1][j][1]); } dp[i][N][0] = max(dp[i - 1][N][0], dp[i - 1][N][1]); for (int j = N - 1; j >= 0; j --) { dp[i][j][0] = max(dp[i][j + 1][0] + val[i][j], max(dp[i - 1][j][0], dp[i - 1][j][1])); } if (i > 1) { ll best = max(dp[i - 2][0][0], dp[i - 2][0][1]); for (int j = 1; j <= N; j ++) { dp[i][j][1] = max(best + get_sum(i - 1, 0, j - 1), dp[i][j][1]); best = max(best, max(dp[i - 2][j][0], dp[i - 2][j][1])); } best = max(dp[i - 2][N][0], dp[i - 2][N][1]) + get_sum(i - 1, 0, N - 1); for (int j = N; j > 0; j --) { dp[i][j][1] = max(best, dp[i][j][1]); best = max(best, max(dp[i - 2][j][0], dp[i - 2][j][1]) + get_sum(i - 1, 0, j - 1)); } } for (int j = 1; j <= N; j ++) { if ((i == 0 || val[i - 1][j - 1] == 0) && (i == N - 1 || val[i + 1][j - 1] == 0)) { dp[i][j][0] = dp[i][j][1] = 0; } //else // cout << i << " " << j << " " << dp[i][j][0] << endl; } } /**cout << "-----------" << endl; for (int i = 0; i < N; i ++, cout << endl) for (int j = 0; j <= N; j ++) cout << dp[i][j][0] << " "; cout << "-----------" << endl; for (int i = 0; i < N; i ++, cout << endl) for (int j = 0; j <= N; j ++) cout << dp[i][j][1] << " ";*/ ll ans = 0; for (int j = 0; j <= N; j ++) for (int t = 0; t < 2; t ++) ans = max(ans, dp[N - 1][j][t]); return ans; }

Compilation message (stderr)

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:65:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |         for (int i = 0; i < col[0].size(); i ++)
      |                         ~~^~~~~~~~~~~~~~~
fish.cpp:70:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |             while(to < col[1].size() && col[1][to].first <= col[0][i].first)
      |                   ~~~^~~~~~~~~~~~~~~
#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...