Submission #838241

#TimeUsernameProblemLanguageResultExecution timeMemory
838241Theo830Catfish Farm (IOI22_fish)C++17
64 / 100
1089 ms143892 KiB
#include "fish.h"
#include<bits/stdc++.h>
#define ii pair<int,long long>
#define F first
#define S second
#define iii pair<ii,int>
using namespace std;
long long dp[3000005][3];
vector<iii>pre[100005];
int n;
long long sum(int i,int j){
    if(i >= n){
        return 0;
    }
    int posi = lower_bound(pre[i].begin(),pre[i].end(),iii(ii(j+1,0),0)) - pre[i].begin();
    posi--;
    return pre[i][posi].F.S;
}
long long solve(int i,int j,int k){
    int pos = -1;
    long long sumi = 0;
    if(i >= n){
        return 0;
    }
    if(j < 0 || j > n){
        return 0;
    }
    if(k == 0 || k == 2){
        int posi = lower_bound(pre[i].begin(),pre[i].end(),iii(ii(j,0),0)) - pre[i].begin();
        j = pre[i][posi].F.F;
        pos = pre[i][posi].S;
    }
    else{
        int posi = lower_bound(pre[i].begin(),pre[i].end(),iii(ii(j+1,0),0)) - pre[i].begin();
        posi--;
        j = pre[i][posi].F.F;
        pos = pre[i][posi].S;
    }
    if(dp[pos][k] != -1){
        return dp[pos][k];
    }
    sumi = sum(i,j);
    long long ans = 0;
    if(k == 0 || k == 2){
        ans = max(ans,solve(i,j+1,k));
        long long val = 0;
        if(k == 0){
            val = sum(i-1,j);
        }
        long long sum2 = sum(i+1,j);
        ans = max(ans,solve(i+1,j,0) - sumi + val);
        ans = max(ans,solve(i+1,j,1) + val + sum2);
        ans = max(ans,solve(i+2,0,2) + val + sum2);
        ans = max(ans,solve(i+2,0,0) + val);
    }
    else{
        long long sum2 = sum(i+1,j);
        ans = max(ans,solve(i,j-1,1));
        ans = max(ans,solve(i+2,0,0) - sumi);
        ans = max(ans,solve(i+2,0,2) - sumi + sum2);
        ans = max(ans,solve(i+1,j,1) - sumi + sum2);
    }
    return dp[pos][k] = ans;
}
long long max_weights(int N, int M, vector<int> X, vector<int> Y, vector<int> W){
    n = N;
    memset(dp,-1,sizeof dp);
    long long sum = 0;
    for(int i = 0;i < M;i++){
        Y[i]++;
        pre[X[i]].push_back(iii(ii(Y[i],W[i]),0));
        pre[X[i]].push_back(iii(ii(Y[i] - 1,0),0));
        if(X[i] > 0){
            pre[X[i] - 1].push_back(iii(ii(Y[i],0),0));
        }
        if(X[i] < n-1){
            pre[X[i] + 1].push_back(iii(ii(Y[i],0),0));
        }
    }
    int cur = 0;
    for(int i = 0;i < N;i++){
        pre[i].push_back(iii(ii(0,0),0));
        pre[i].push_back(iii(ii(n,0),0));
        sort(pre[i].begin(),pre[i].end());
        int m = pre[i].size();
        pre[i][0].S = cur;
        cur++;
        for(int j = 1;j < m;j++){
            pre[i][j].F.S += pre[i][j-1].F.S;
            pre[i][j].S = cur;
            cur++;
        }
    }
    return solve(0,0,2);
}
/*
int main() {
  srand(time(0));
  int N = 2, M = 1;
  //assert(2 == scanf("%d %d", &N, &M));

  std::vector<int> X(M), Y(M), W(M);
  for (int i = 0; i < M; ++i) {
    W[i] = 1000000000;
    X[i] = 0;
    Y[i] = 0;
    //assert(3 == scanf("%d %d %d", &X[i], &Y[i], &W[i]));
  }

  long long result = max_weights(N, M, X, Y, W);
  printf("%lld\n", result);
  return 0;
}
*/

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:68:15: warning: unused variable 'sum' [-Wunused-variable]
   68 |     long long sum = 0;
      |               ^~~
#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...