제출 #1234070

#제출 시각아이디문제언어결과실행 시간메모리
1234070dosts메기 농장 (IOI22_fish)C++20
0 / 100
1096 ms18776 KiB
#include "fish.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e9;
const int NN = 100001;

int max_weights(signed N, signed M, vector<signed> X,vector<signed> Y, vector<signed> W) {
    //dp[top/bot][0]->dp[top/bot][1] 0 cost
    //dp[i][j][rising] --> max(dp[i-1][j'][rising]+w[i-1][h[j]]-w[i-1][h[j']])
    //dp[i][j][fall] = max(dp[i-1][j'][fall]-w[i][h[j]]+w[i][h[j]-1]); //O(4*(M+N)*prefsm)
    for (int i = 0;i<M;i++) X[i]++,Y[i]++;
    vector<vector<pii>> dp(N+2);
    vector<pii> fishes[N+2];
    vi pts[N+2];
    for (int i=0;i<M;i++) pts[X[i]].push_back(Y[i]),fishes[X[i]].push_back({Y[i],W[i]});
    for (int i=1;i<=N+1;i++) {
      pts[i].push_back(0);
      if (i < N+1)pts[i].push_back(N);
    }
    for (int i=1;i<=N+1;i++) {
      sort(all(pts[i]));
      pts[i].erase(unique(all(pts[i])),pts[i].end());
    }
    for (int i=1;i<=N+1;i++) dp[i].assign(big(pts[i]),pii{-inf,-inf});
    for (int j = 0;j<big(pts[1]);j++) dp[1][j] = {0,0};
    auto getweights = [&](int col,int h) {
      int sm = 0;
      for (auto& [hei,wei] : fishes[col]) {
        if (hei <= h) sm+=wei;
      }
      return sm;
    };
    for (int i=2;i<=N+1;i++) {
      for (int j=0;j<big(pts[i]);j++) {
        //bi önceki benden büyük (riyal)
        for (int jp = 0;jp<big(pts[i-1]) && pts[i-1][jp] <= pts[i][j];jp++) {
          dp[i][j].ff = max(dp[i][j].ff,
                        dp[i-1][jp].ff+getweights(i-1,pts[i][j])-getweights(i-1,pts[i-1][jp]));
        }
        for (int jp = big(pts[i-1])-1;jp>=0 && pts[i-1][jp] >= pts[i][j];jp--) {
          dp[i][j].ss = max(dp[i][j].ss,
                        dp[i-1][jp].ss-getweights(i,pts[i][j])+getweights(i,pts[i-1][jp]));
        }
      }
      if (i > 2) {
        for (int j = 0;j<big(pts[i]);j++) {
          for (int jj = 0;jj<big(pts[i-2]);jj++) {
            dp[i][j].ss = max(dp[i][j].ss,dp[i-2][jj].ff+getweights(i,N)-getweights(i,pts[i][j])+
                                                           getweights(i-2,N)-getweights(i-2,pts[i-2][jj]));
            dp[i][j].ff = max(dp[i][j].ff,dp[i-2][jj].ss+getweights(i-1,max(pts[i][j],pts[i-2][jj])));
          }
        }
      }

    }
    int ans = 0;
    for (pii itt : dp[N+1]) {
      ans = max(ans,itt.ff);
      ans = max(ans,itt.ss);
    }
    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...