Submission #628344

#TimeUsernameProblemLanguageResultExecution timeMemory
628344guangxuanCatfish Farm (IOI22_fish)C++17
52 / 100
800 ms2097152 KiB
#include "fish.h"
#include <bits/stdc++.h>
typedef long long ll;

const ll INF= 1LL<<60;
using namespace std;

long long max_weights(int N, int M, std::vector<int> X, vector<int> Y,
                      vector<int> W) {
    for(int i=0;i<M;i++){
        Y[i]+=1;
    }
    ll rs[N+1][N+1]={};
    for(int i=0;i<M;i++){
        rs[X[i]][Y[i]]+=W[i];
    }
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            rs[i][j+1]+=rs[i][j];
        }
    }
    ll dp[N][3][N+1]; // (0, h[i-1]), (h[i-1] <= h[i], h[i]), (h[i-1]>h[i], h[i])
    memset(dp,0,sizeof dp);
    for(int i=0;i<=N;i++){
        dp[1][0][i]=rs[1][i];
        dp[1][1][i]=rs[0][i];
        dp[1][2][i]=rs[1][N]-rs[1][i];
    }
    for(int i=2;i<N;i++){
        for(int j=0;j<=N;j++){
            dp[i][0][j]=max(dp[i-1][1][j],dp[i-1][2][j])+rs[i][j];
        }
        //0,k -> 1,j
        ll cmax = -INF;
        for(int j=0;j<=N;j++){
            cmax = max(cmax,dp[i-1][0][j]+rs[i-1][j]);
            dp[i][1][j]=max(dp[i][1][j],cmax-rs[i-1][j]);
        }
        cmax = -INF;
        for(int j=N;j>=0;j--){
            cmax = max(cmax,dp[i-1][0][j]);
            dp[i][1][j]=max(dp[i][1][j],cmax);
        }
        //1,k -> 1,j
        cmax = -INF;
        for(int j=0;j<=N;j++){
            cmax = max(cmax, dp[i-1][1][j]-rs[i-1][j]);
            dp[i][1][j]=max(dp[i][1][j],cmax+rs[i-1][j]);
        }
        //1,k 2,k -> 2,j
        cmax = -INF;
        for(int j=N-1;j>=0;j--){
            cmax = max(cmax, max(dp[i-1][1][j+1],dp[i-1][2][j+1])+rs[i][j+1]);
            dp[i][2][j]=max(dp[i][2][j],cmax-rs[i][j]);
        }
    }
    ll ans = 0;
    /*for(int i=0;i<=N;i++){
        for(int j=0;j<3;j++){
            for(int k=0;k<=N;k++){
                cout << dp[i][j][k] << ' ';
            }
            cout << endl;
        }
        cout << endl;
    }*/
    for(int j=0;j<3;j++)
        for(int k=0;k<=N;k++)ans = max(ans, dp[N-1][j][k]);
    return ans;
}
#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...