Submission #705215

#TimeUsernameProblemLanguageResultExecution timeMemory
705215danikoynovCatfish Farm (IOI22_fish)C++17
61 / 100
708 ms331192 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]; vector < int > state[maxn]; unordered_set < int > state_set[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()); for (int i = 0; i < M; i ++) { if (X[i] != 0) state_set[X[i] - 1].insert(Y[i] + 1); if (X[i] != N - 1) state_set[X[i] + 1].insert(Y[i] + 1); } for (int i = 0; i < N; i ++) { state_set[i].insert(0); state_set[i].insert(N); } for (int i = 0; i < N; i ++) { for (auto it : state_set[i]) state[i].push_back(it); sort(state[i].begin(), state[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 = 0; j <= N; j ++) { if (state_set[i].find(j) == state_set[i].end()) 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:87: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]
   87 |         for (int i = 0; i < col[0].size(); i ++)
      |                         ~~^~~~~~~~~~~~~~~
fish.cpp:92: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]
   92 |             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...