Submission #1130988

#TimeUsernameProblemLanguageResultExecution timeMemory
1130988belgianbotCatfish Farm (IOI22_fish)C++20
3 / 100
211 ms86272 KiB
#include "fish.h"

#include <bits/stdc++.h>

using namespace std;

struct fish {
  int x, y, w;
};
int M, N;
vector<fish> f;
vector<int> idxAct;
vector<vector<long long>> prefAct;
vector<vector<vector<long long>>> memo;

long long prefixAct(int n, int l, int r) {
  if (r < l) return 0;
  if (l <= 0) return prefAct[n][r];
  return prefAct[n][r] - prefAct[n][l-1];
}
bool comp2 (const fish &a, const fish &b) {
  if (a.x < b.x) return true;
  if (a.x == b.x && a.y < b.y) return true;
  if (a.x == b.x && a.y == b.y && a.w < b.w) return true;
  return false;
}
long long dp(int i, bool canright, bool didright, int curr) {
  if (i >= M) return 0;

  if (f[i].x == curr + 1) {
    canright = !didright;
    didright = false;
  }
  else if (f[i].x > curr + 1) {
    canright = true;
    didright = false;
  }
  curr = f[i].x;

  
  if (memo[i][canright][didright] != -1) return memo[i][canright][didright];
  if (i != M -1 && f[i+1].x == curr) return memo[i][canright][didright] = dp(i + 1, canright, didright, curr);
  
  long long left = dp(i + 1, canright, didright, curr) + prefixAct(f[i].x, 0, idxAct[i]);
  int index = lower_bound(f.begin(), f.end(), fish({curr-1, N, -1}), comp2) - 1 - f.begin();
  if (f[index].x == curr - 1) left -= prefixAct(curr - 1, 0, idxAct[index]);

  long long right = 0;
  if (canright) right = dp(i + 1, canright, true, curr);

  return memo[i][canright][didright] = max(left, right);
}
long long max_weights(int NN, int MM, vector<int> X, vector<int> Y,vector<int> W) {
  ios::sync_with_stdio(false);
  M = MM, N = NN;
  f.resize(M);
  for (int i = 0; i < M; i++) f[i] = fish({X[i], Y[i], W[i]});

  sort(f.begin(), f.end(), comp2);

  prefAct.resize(N); idxAct.resize(M);
  for (int i = 0; i < M; i++) {
    idxAct[i] = (int)(prefAct[f[i].x].size());
    prefAct[f[i].x].push_back(f[i].w);
  }
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < int(prefAct[i].size()); j++) {
      if (j) prefAct[i][j] += prefAct[i][j-1];
    }
  }
  memo.resize(M, vector<vector<long long>>(2, vector<long long>(2,-1)));

  return dp(0, true, false, -10);
}
#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...