제출 #1225393

#제출 시각아이디문제언어결과실행 시간메모리
1225393guagua0407메기 농장 (IOI22_fish)C++20
100 / 100
263 ms79392 KiB
#pragma GCC optimize("O3")
#include "fish.h"
//#include "grader.cpp"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

namespace{
    const int mxn=1e5+5;
    const ll inf=(ll)1e18;
    vector<vector<ll>> dpl,dpr;
}

long long max_weights(int n, int m, std::vector<int> X, std::vector<int> Y,std::vector<int> W) {
    auto st=clock();
    vector<int> x=X;
    vector<int> y=Y;
    vector<int> w=W;
    for(int i=0;i<m;i++){
        x[i]++;
        y[i]++;
        //cout<<x[i]<<' '<<y[i]<<' '<<w[i]<<'\n';
    }
    vector<vector<int>> pos(n+1);
    for(int i=0;i<m;i++){
        pos[x[i]].push_back(i);
    }
    vector<vector<int>> ys(n+1);
    vector<vector<ll>> pre(n+1);
    vector<vector<int>> prv(n+1);
    vector<vector<int>> nxt(n+1);
    vector<int> sz(n+1);
    for(int i=0;i<=n;i++){
        ys[i].push_back(0);
        for(auto v:pos[i]){
            //ys[i].push_back(y[v]-1);
            ys[i].push_back(y[v]);
        }
        if(i>0){
            for(auto v:pos[i-1]){
                ys[i].push_back(y[v]);
                //ys[i].push_back(y[v]-1);
            }
        }
        if(i<n){
            for(auto v:pos[i+1]){
                ys[i].push_back(y[v]);
                //ys[i].push_back(y[v]-1);
            }
        }
        sort(all(ys[i]));
        ys[i].resize(unique(all(ys[i]))-ys[i].begin());
        sz[i]=(int)ys[i].size();
        pre[i]=vector<ll>(sz[i]);
        for(auto v:pos[i]){
            int j=lower_bound(all(ys[i]),y[v])-ys[i].begin();
            pre[i][j]+=w[v];
        }
        for(int j=1;j<sz[i];j++){
            pre[i][j]+=pre[i][j-1];
        }
    }
    for(int i=0;i<=n;i++){
        if(i>0){
            prv[i]=vector<int>(sz[i]);
            for(int j=0;j<sz[i];j++){
                prv[i][j]=upper_bound(all(ys[i-1]),ys[i][j])-ys[i-1].begin()-1;
            }
        }
        if(i<n){
            nxt[i]=vector<int>(sz[i]);
            for(int j=0;j<sz[i];j++){
                nxt[i][j]=upper_bound(all(ys[i+1]),ys[i][j])-ys[i+1].begin()-1;
            }
        }
    }
    dpl.resize(n+1);
    dpr.resize(n+1);
    for(int i=0;i<=n;i++){
        dpl[i]=vector<ll>(sz[i],-inf);
        dpr[i]=vector<ll>(sz[i],-inf);
    }
    dpr[0][0]=0;
    ll ans=0;
    for(int i=0;i<n;i++){
        {
            int r=sz[i]-1;
            ll mx=-inf;
            for(int l=sz[i+1]-1;l>=0;l--){
                while(r>=0 and ys[i][r]>=ys[i+1][l]){
                    mx=max(mx,dpr[i][r]);
                    r--;
                }
                dpl[i+1][l]=max(dpl[i+1][l],mx);
                dpr[i+1][l]=max(dpr[i+1][l],mx);
            }
        }
        {
            int r=0;
            ll mx=-inf;
            for(int l=0;l<sz[i+1];l++){
                while(r<sz[i] and ys[i][r]<=ys[i+1][l]){
                    mx=max(mx,dpr[i][r]-pre[i][r]);
                    r++;
                }
                dpl[i+1][l]=max(dpl[i+1][l],mx+pre[i][prv[i+1][l]]);
                dpr[i+1][l]=max(dpr[i+1][l],mx+pre[i][prv[i+1][l]]);
            }
        }
        //continue;
        {
            int l=sz[i]-1;
            ll mx=-inf;
            for(int r=sz[i+1]-1;r>=0;r--){
                while(l>=0 and ys[i][l]>=ys[i+1][r]){
                    dpr[i+1][nxt[i][l]]=max(dpr[i+1][nxt[i][l]],dpl[i][l]+pre[i+1][nxt[i][l]]);
                    mx=max(mx,dpl[i][l]+pre[i+1][nxt[i][l]]);
                    l--;
                }
                dpl[i+1][r]=max(dpl[i+1][r],mx-pre[i+1][r]);
            }
        }
        //continue;
        {
            int l=0;
            ll mx=-inf;
            for(int r=0;r<sz[i+1];r++){
                while(l<sz[i] and ys[i][l]<=ys[i+1][r]){
                    //cout<<i<<' '<<l<<' '<<dpl[i][l]<<'\n';
                    mx=max(mx,dpl[i][l]);
                    l++;
                }
                dpr[i+1][r]=max(dpr[i+1][r],mx);
                dpl[i+1][r]=max(dpl[i+1][r],mx);
            }
        }
    }
    for(int i=0;i<=n;i++){
        for(int j=0;j<sz[i];j++){
            //cout<<i<<' '<<j<<' '<<dpl[i][j]<<' '<<dpr[i][j]<<'\n';
            ans=max({ans,dpl[i][j],dpr[i][j]});
        }
    }
    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...