답안 #628376

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
628376 2022-08-13T11:01:53 Z guangxuan 메기 농장 (IOI22_fish) C++17
0 / 100
151 ms 48060 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+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,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 13940 KB Output is correct
2 Correct 58 ms 15908 KB Output is correct
3 Correct 19 ms 11988 KB Output is correct
4 Correct 20 ms 11988 KB Output is correct
5 Runtime error 151 ms 48060 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 79 ms 17152 KB Output is correct
3 Correct 94 ms 19768 KB Output is correct
4 Correct 47 ms 13936 KB Output is correct
5 Correct 56 ms 15924 KB Output is correct
6 Correct 0 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 212 KB Output is correct
10 Correct 20 ms 12000 KB Output is correct
11 Correct 20 ms 11940 KB Output is correct
12 Correct 49 ms 13976 KB Output is correct
13 Correct 57 ms 15928 KB Output is correct
14 Incorrect 47 ms 13944 KB 1st lines differ - on the 1st token, expected: '20226650012153', found: '20226987086125'
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 11980 KB Output is correct
2 Correct 20 ms 11988 KB Output is correct
3 Incorrect 43 ms 14192 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 0 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Incorrect 1 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 0 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Incorrect 1 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 0 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Incorrect 1 ms 468 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799129753765'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 11980 KB Output is correct
2 Correct 20 ms 11988 KB Output is correct
3 Incorrect 43 ms 14192 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '21254994796333'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 13940 KB Output is correct
2 Correct 58 ms 15908 KB Output is correct
3 Correct 19 ms 11988 KB Output is correct
4 Correct 20 ms 11988 KB Output is correct
5 Runtime error 151 ms 48060 KB Execution killed with signal 11
6 Halted 0 ms 0 KB -