Submission #791003

#TimeUsernameProblemLanguageResultExecution timeMemory
791003penguinmanCatfish Farm (IOI22_fish)C++17
14 / 100
1067 ms6832 KiB
#include "fish.h"

#include <bits/stdc++.h>

using std::vector;
using std::string;
using std::cin;
using std::cout;
using ll = long long;
using vi = vector<ll>;
using vii = vector<vi>;
using pii = std::pair<ll,ll>;
#define ln "\n"
#define rep(i,j,k) for(ll i=ll(j); i<ll(k); i++)
#define REP(i,j,k) for(ll i=ll(j); i<=ll(k); i++)
#define per(i,j,k) for(ll i=ll(j); i>=ll(k); i--)
#define all(a) a.begin(), a.end()
#define mp std::make_pair
#define pb emplace_back
constexpr ll inf = (1ll<<60);

long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) {
  // task 6
  if(N > 3000) return N;
  rep(i,0,M) X[i]++, Y[i]++;
  // data1 : その行
  // data2 : 隣接
  vector<vector<pii>> data1(N+2), data2(N+2);
  rep(i,0,M){
    data1[X[i]].pb(mp(Y[i],W[i]));
    if(X[i]-1) data2[X[i]-1].pb(mp(Y[i],W[i]));
    if(X[i]+1 <= N) data2[X[i]+1].pb(mp(Y[i],W[i]));
  }
  vii sum(N+2);
  rep(i,0,N+2){
    data1[i].pb(mp(0,0));
    data2[i].pb(mp(0,0));
    sort(all(data1[i]));
    sort(all(data2[i]));
    sum[i].resize(data1[i].size());
    rep(j,1,data1[i].size()) sum[i][j] = sum[i][j-1]+data1[i][j].second;
  }
  auto id = [&](ll x, ll height){
    ll idx = std::upper_bound(all(data1[x]), mp(height, inf))-data1[x].begin();
    idx--;
    return idx;
  };
  auto calc = [&](ll x, ll height){
    ll idx = std::upper_bound(all(data1[x]), mp(height, inf))-data1[x].begin();
    idx--;
    return sum[x][idx];
  };
  vii up(N+2), down(N+2);
  up[0].resize(1);
  down[0].resize(1);
  up[0][0] = down[0][0] = 0;
  rep(i,1,N+2){
    up[i].resize(data2[i].size(),-inf);
    down[i].resize(data2[i].size(),-inf);
    rep(j,0,data2[i].size()){
      rep(k,0,data2[i-1].size()){
        if(data2[i-1][k] <= data2[i][j]){
          up[i][j] = std::max(up[i][j], up[i-1][k]+calc(i-1, data2[i][j].first)-calc(i-1, data2[i-1][k].first));
        }
        if(data2[i-1][k] >= data2[i][j]){
          down[i][j] = std::max(down[i][j], down[i-1][k]+calc(i, data2[i-1][k].first)-calc(i, data2[i][j].first));
        }
      }
    }
    if(i-2 >= 0){
      rep(j,0,data2[i].size()){
        rep(k,0,data2[i-2].size()){
          up[i][j] = std::max(up[i][j], down[i-2][k]+calc(i-1, std::max(data2[i-2][k].first, data2[i][j].first)));
        }
      }
    }
    if(i-3 >= 0){
      rep(j,0,data2[i].size()){
        rep(k,0,data2[i-3].size()){
          up[i][j] = std::max(up[i][j], down[i-3][k]+calc(i-2, data2[i-3][k].first)+calc(i-1,data2[i][j].first));
        }
      }
    }
    rep(j,0,data2[i].size()) down[i][j] = std::max(down[i][j], up[i][j]);
  }
  ll ans = std::max(up[N+1][0], down[N+1][0]);
  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:43:8: warning: variable 'id' set but not used [-Wunused-but-set-variable]
   43 |   auto id = [&](ll x, ll height){
      |        ^~
#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...