답안 #628378

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
628378 2022-08-13T11:03:20 Z guangxuan 메기 농장 (IOI22_fish) C++17
0 / 100
149 ms 48032 KB
#include "fish.h"
#define F first
#define S second
#include <bits/stdc++.h>
typedef long long ll;

const ll INF= 1LL<<60;
using namespace std;
typedef pair<int, ll> pil;

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;
    }
    vector<pil> rs[N];
    for(int i=0;i<M;i++){
        rs[X[i]].emplace_back(Y[i],W[i]);
    }
    for(int i=0;i<N;i++){
        rs[i].emplace_back(0,0);
        sort(rs[i].begin(),rs[i].end());
        if(rs[i].back().first!=N+1)rs[i].emplace_back(N+1,0);
        for(int j=1;j<(int)rs[i].size();j++){
            rs[i][j].S+=rs[i][j-1].S;
        }
    }
    ll dp[2][3][N+2]; // (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,k=0;i<(int)rs[0].size();i++){
        while(k+1<(int)rs[1].size() && rs[0][i].F>rs[1][k+1].F){
            k++;
        }
        dp[1][0][i]=rs[1][k].S;
    }
    for(int i=0,k=0;i<(int)rs[1].size();i++){
        while(k+1<(int)rs[0].size() && rs[1][i].F>rs[0][k+1].F ){
            k++;
        }
        dp[1][1][i]=rs[0][k].S;
        dp[1][2][i]=rs[1].back().S-rs[1][max(i-1,0)].S;
    }
    for(int i=2;i<N;i++){
        for(int j=0;j<3;j++){
            for(int k=0;k<(int)max(rs[i-1].size(),rs[i].size());k++){
                dp[i&1][j][k]=0;
            }   
        }
        int rss = rs[i].size();
        int ps = rs[i-1].size();
        int pps = rs[i-2].size();
        for(int j=0, k = 0;j<ps;j++){
            while(k+1<rss && rs[i-1][j].F > rs[i][k+1].F){
                k++;
            }
            dp[i&1][0][j]=max(dp[(i&1)^1][1][j],dp[(i&1)^1][2][j])+rs[i][k].S;
        }
        //0,k -> 1,j
        ll cmax = -INF;
        for(int j=0, k =0, l=0, l2=0;j<rss;j++){
            while(k<pps && rs[i][j].F>rs[i-2][k].F){
                while(l+1<ps && rs[i-2][k].F > rs[i-1][l+1].F){
                    l++;
                }
                cmax = max(cmax,dp[(i&1)^1][0][k]+rs[i-1][l].S);
                k++;
            }
            while(l2+1<ps && rs[i][j].F > rs[i-1][l2+1].F){
                l2++;
            }
            dp[i&1][1][j]=max(dp[i&1][1][j],cmax-rs[i-1][max(l2-1,0)].S);
        }
        cmax = -INF;
        for(int j=rss-1,k=pps-1 ;j>=0;j--){
            while(k>=0 && rs[i][j].F<=rs[i-2][k].F){
                cmax = max(cmax,dp[(i&1)^1][0][k]);
                k--;
            }
            dp[i&1][1][j]=max(dp[i&1][1][j],cmax);
        }
        //1,k -> 1,j
        cmax = -INF;
        for(int j=0, k=0;j<rss;j++){
            while(k<ps && rs[i][j].F>rs[i-1][k].F){
                cmax = max(cmax, dp[(i&1)^1][1][k]-rs[i-1][max(k-1,0)].S);
                k++;
            }
            dp[i&1][1][j]=max(dp[i&1][1][j],cmax+rs[i-1][max(k-1,0)].S);
        }
        //1,k 2,k -> 2,j
        cmax = -INF;
        for(int j=rss-1, k = ps-1, l = rss-1;j>=0;j--){
            while(k>=0 && rs[i][j].F<=rs[i-1][k].F){
                while(l-1>=0 && rs[i-1][k].F<=rs[i-1][l].F)l--;
                cmax = max(cmax, max(dp[(i&1)^1][1][k],dp[(i&1)^1][2][k])+rs[i][l].S);
                k--;
            }
            dp[i&1][2][j]=max(dp[i&1][2][j],cmax-rs[i][j].S);
        }
    }
    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&1][j][k] << ' ';
            }
            cout << endl;
        }
        cout << endl;
    }*/
    for(int k=0;k<(int)rs[N-2].size();k++)ans = max(ans, dp[(N-1)&1][0][k]);
    for(int j=1;j<3;j++)
        for(int k=0;k<(int)rs[N-1].size();k++)ans = max(ans, dp[(N-1)&1][j][k]);
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 14012 KB Output is correct
2 Correct 56 ms 15920 KB Output is correct
3 Correct 19 ms 12036 KB Output is correct
4 Correct 26 ms 12028 KB Output is correct
5 Runtime error 149 ms 48032 KB Execution killed with signal 11
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 99 ms 17224 KB Output is correct
3 Correct 105 ms 19796 KB Output is correct
4 Correct 58 ms 14016 KB Output is correct
5 Correct 56 ms 15908 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 288 KB Output is correct
10 Correct 20 ms 11944 KB Output is correct
11 Correct 20 ms 12008 KB Output is correct
12 Correct 49 ms 14044 KB Output is correct
13 Correct 73 ms 15932 KB Output is correct
14 Incorrect 48 ms 14056 KB 1st lines differ - on the 1st token, expected: '20226650012153', found: '20226987086125'
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 11936 KB Output is correct
2 Correct 19 ms 12036 KB Output is correct
3 Incorrect 39 ms 14248 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '21254994796333'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Incorrect 2 ms 468 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799129753765'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Incorrect 2 ms 468 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799129753765'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Incorrect 2 ms 468 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799129753765'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 11936 KB Output is correct
2 Correct 19 ms 12036 KB Output is correct
3 Incorrect 39 ms 14248 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '21254994796333'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 14012 KB Output is correct
2 Correct 56 ms 15920 KB Output is correct
3 Correct 19 ms 12036 KB Output is correct
4 Correct 26 ms 12028 KB Output is correct
5 Runtime error 149 ms 48032 KB Execution killed with signal 11
6 Halted 0 ms 0 KB -