답안 #1046723

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1046723 2024-08-06T21:01:45 Z Trent 메기 농장 (IOI22_fish) C++17
61 / 100
881 ms 2097152 KB
#include "fish.h"
#include "bits/stdc++.h";
using namespace std;
#define forR(i, x) for(int i = 0; i < (x); ++i)
#define REP(i, a, b) for(int i = (a); i < (b); ++i)
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<int> vi;
typedef vector<vi> vvi;
struct pii{int a, b;};

ll INF = 1e16;

long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y,
                      std::vector<int> W) {
  int MH = Y[0] + 1;
  for(int i : Y) MH = max(MH, i + 1);
  vvll wp(N, vll(MH));
  vvll wpsa(N, vll(MH));
  forR(i, M) wp[X[i]][Y[i]] = W[i];
  forR(x, N) {
    wpsa[x][0] = wp[x][0];
    REP(y, 1, MH) wpsa[x][y] = wpsa[x][y-1] + wp[x][y];
  }

  vector<set<int>> sCare(N);
  forR(i, M) {
    if(X[i] > 0) sCare[X[i]-1].insert(Y[i] + 1);
    if(X[i] + 1 < N) sCare[X[i] + 1].insert(Y[i] + 1);
    if(X[i] > 1) sCare[X[i]-2].insert(Y[i] + 1);
    if(X[i] + 2 < N) sCare[X[i] + 2].insert(Y[i] + 1);
    sCare[X[i]].insert(Y[i]+1);
  }
  forR(i, N) sCare[i].insert(0);
  vector<vi> care(N);
  forR(i, N) for(int j : sCare[i]) care[i].push_back(j);
  vvll I(N, vll(MH+1)), D(N, vll(MH+1)), E(N, vll(MH+1));
  // h = HEIGHT, not the index of last element!
  forR(i, N) {
    ll besIE = -INF, besII = -INF;
    if(i > 0) {
      for(int k : care[i-1]) besIE = max(besIE, E[i-1][k] - (k > 0 ? wpsa[i-1][k-1] : 0));
    }
    int api = 0;
    for(int h : care[i]){
      if(h > 0) {
        if(i == 0) I[i][h] = 0;
        else {
          I[i][h] = max(I[i][h], besIE + wpsa[i-1][h-1]);
          while(api < care[i-1].size() && care[i-1][api] <= h) {
            int k = care[i-1][api];
            besII = max(besII, I[i-1][k] - (k > 0 ? wpsa[i-1][k-1] : 0));
            ++api;
          }
          I[i][h] = max(I[i][h], besII + wpsa[i-1][h-1]);
        }
      }
    }

    api = (int) care[i-1].size() - 1;
    ll besD = -INF;
    for(int h = MH; h > 0; --h) {
      if(i == 0) D[i][h] = 0;
      else {
        while(api >= 0 && care[i-1][api] >= h + 1) {
          int k = care[i-1][api];
          if(k <= MH) {
            besD = max(besD, max(I[i-1][k], D[i-1][k]) + wpsa[i][k - 1]);
          }
          --api;
        }
        D[i][h] = max(D[i][h], besD - (h > 0 ? wpsa[i][h-1] : 0));
      }
    }

    ll besE = -INF;
    if(i > 0) {
      forR(y, MH+1) besE = max(besE, E[i-1][y]);
    }
    for(int h : care[i]) {
      if(i == 0) E[i][h] = 0;
      else {
        ll tot = max(I[i-1][h], D[i-1][h]) + (h > 0 ? wpsa[i][h-1] : 0);
        // forR(y, h) tot += wp[i][y];
        E[i][h] = max(E[i][h], max(tot, besE));
      }
    }
  }
  ll mx = 0;
  REP(h, 1, MH+1) mx = max(mx, max(I[N-1][h], D[N-1][h]));
  forR(h, MH+1) mx = max(mx, E[N-1][h]);
  return mx;
}

Compilation message

fish.cpp:2:25: warning: extra tokens at end of #include directive
    2 | #include "bits/stdc++.h";
      |                         ^
fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:51:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |           while(api < care[i-1].size() && care[i-1][api] <= h) {
      |                 ~~~~^~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Runtime error 672 ms 2097152 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Runtime error 680 ms 2097152 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 42508 KB Output is correct
2 Correct 36 ms 42588 KB Output is correct
3 Correct 50 ms 42356 KB Output is correct
4 Correct 44 ms 45908 KB Output is correct
5 Correct 70 ms 49492 KB Output is correct
6 Correct 60 ms 49744 KB Output is correct
7 Correct 62 ms 49680 KB Output is correct
8 Correct 64 ms 49756 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 604 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 1 ms 604 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 604 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 1 ms 604 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
15 Correct 2 ms 3932 KB Output is correct
16 Correct 2 ms 704 KB Output is correct
17 Correct 29 ms 8532 KB Output is correct
18 Correct 28 ms 7940 KB Output is correct
19 Correct 26 ms 8272 KB Output is correct
20 Correct 25 ms 7516 KB Output is correct
21 Correct 25 ms 5712 KB Output is correct
22 Correct 50 ms 10832 KB Output is correct
23 Correct 9 ms 5976 KB Output is correct
24 Correct 23 ms 9348 KB Output is correct
25 Correct 1 ms 860 KB Output is correct
26 Correct 9 ms 5792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 604 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 1 ms 604 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
15 Correct 2 ms 3932 KB Output is correct
16 Correct 2 ms 704 KB Output is correct
17 Correct 29 ms 8532 KB Output is correct
18 Correct 28 ms 7940 KB Output is correct
19 Correct 26 ms 8272 KB Output is correct
20 Correct 25 ms 7516 KB Output is correct
21 Correct 25 ms 5712 KB Output is correct
22 Correct 50 ms 10832 KB Output is correct
23 Correct 9 ms 5976 KB Output is correct
24 Correct 23 ms 9348 KB Output is correct
25 Correct 1 ms 860 KB Output is correct
26 Correct 9 ms 5792 KB Output is correct
27 Correct 160 ms 354380 KB Output is correct
28 Correct 178 ms 45296 KB Output is correct
29 Correct 564 ms 398300 KB Output is correct
30 Correct 816 ms 434284 KB Output is correct
31 Correct 824 ms 432728 KB Output is correct
32 Correct 241 ms 39248 KB Output is correct
33 Correct 854 ms 436820 KB Output is correct
34 Correct 881 ms 436844 KB Output is correct
35 Correct 116 ms 41260 KB Output is correct
36 Correct 690 ms 416884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 42508 KB Output is correct
2 Correct 36 ms 42588 KB Output is correct
3 Correct 50 ms 42356 KB Output is correct
4 Correct 44 ms 45908 KB Output is correct
5 Correct 70 ms 49492 KB Output is correct
6 Correct 60 ms 49744 KB Output is correct
7 Correct 62 ms 49680 KB Output is correct
8 Correct 64 ms 49756 KB Output is correct
9 Runtime error 664 ms 2097152 KB Execution killed with signal 9
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 672 ms 2097152 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -