Submission #1125761

#TimeUsernameProblemLanguageResultExecution timeMemory
1125761zNatsumiCatfish Farm (IOI22_fish)C++20
3 / 100
1100 ms107632 KiB
#include <bits/stdc++.h>

using namespace std;

const int32_t N = 1e5 + 5,
              M = 3e5 + 5;
const int64_t INF = 1e18;

int n, m;
struct info{
  int x, y, w;
  info(){}
  info(int x, int y, int w): x(x), y(y), w(w) {}
} fish[M];

namespace sub1{
  long long solve(){
    long long res = 0LL;
    for(int i = 1; i <= m; i++) res += fish[i].w;
    return res;
  }
}

namespace sub6{
  long long dp[3005][3005][2], weight[3005][3005], pref1[3005][3005], pref2[3005][3005], pref3[3005];

  long long solve(){
    for(int i = 1; i <= m; i++) weight[fish[i].x][fish[i].y] = fish[i].w;

    long long res = 0;
    for(int i = 1; i <= n; i++){
      if(i > 0) pref3[i] = -INF;
      for(int j = 0; j <= n + 1; j++){
        for(int z = 0; z <= 1; z++) dp[i][j][z] = max(dp[i][j][z], dp[i - 1][j][z]);
        if(i > 1) pref1[i][j] = -INF;
        pref2[i][j] = -INF;
      }

      if(i > 1){ // case 0
        long long add = 0, sub = 0;
        for(int j = 1; j <= n; j++){
          add += weight[i][j];
          sub += weight[i - 1][j];
          dp[i][j][0] = max(dp[i][j][0], pref1[i - 1][j] + add - sub);
        }
        for(int j = 1; j <= n; j++) dp[i][n][0] = max({dp[i][n][0], dp[i - 2][j][0] + add, dp[i - 2][j][1] + add});
        for(int j = n; j >= 1; j--) pref1[i][j] = max(pref1[i][j + 1], dp[i][j][0]);
        res = max(res, pref1[i][1]);
      }

      if(i < n){
        long long add = 0;
        for(int j = 1; j <= n; j++){
          add += weight[i][j];
          dp[i][j][1] = max(dp[i][j][1], pref2[i - 1][j] + add);
        }
        add = 0;
        for(int j = 1; j <= n; j++){
          add += weight[i + 1][j];
          pref2[i][j] = max(pref2[i][j - 1], dp[i][j][1] - add);
          pref3[i] = max(pref3[i], dp[i][j][1]);
        }

        add = 0;
        for(int j = 1; j <= n; j++){
          add += weight[i][j];
          dp[i][j][1] = max(dp[i][j][1], pref1[i - 1][1] + add);
          if(j >= 2) dp[i][j][1] = max(dp[i][j][1], pref3[i - 2]);
        }
        res = max(res, dp[i][n][1]);
      }
    }
    return res;
  }
}

int64_t max_weights(int _N, int _M, vector<int> _X, vector<int> _Y, vector<int> _W){
  n = _N; m = _M;
  for(int i = 0; i < m; i++) fish[i + 1] = info(_X[i] + 1, _Y[i] + 1, _W[i]);

  bool flag1 = true;
  for(int i = 1; i <= m; i++) if(!(fish[i].x & 1)){ flag1 = false; break; }

  if(flag1) return sub1::solve();
  else return sub6::solve();
}

//#define zNatsumi
#ifdef zNatsumi

int main(){
  cin.tie(0)->sync_with_stdio(0);
  #define task "test"
  if(fopen(task ".inp", "r")){
    freopen(task ".inp", "r", stdin);
    freopen(task ".out", "w", stdout);
  }
  int n, m; cin >> n >> m;
  vector<int> x(m), y(m), w(m);
  for(int i = 0; i < m; i++) cin >> x[i] >> y[i] >> w[i];

  cout << max_weights(n, m, x, y, w);
}

#endif
#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...