답안 #635920

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
635920 2022-08-27T11:33:36 Z slime 메기 농장 (IOI22_fish) C++17
100 / 100
453 ms 94100 KB
#include "fish.h"
#include "bits/stdc++.h"


#include <vector>

using namespace std;


vector<pair<int, long long> > cs[100010];

long long columnSum(int i, int R) {
  if(R < 0) return 0;
  if(cs[i].empty()) return 0;
  int lb = 0, rb = cs[i].size() - 1;
  while(lb < rb) {
    int mid = (lb + rb + 1) >> 1;
    if(cs[i][mid].first <= R) lb = mid;
    else rb = mid - 1;
  }
  if(cs[i][lb].first <= R) return cs[i][lb].second;
  else return 0;
}


vector<int> possible_heights[100010];


long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) {

  for(int i=0; i<M; i++) {
    cs[X[i]].push_back({Y[i], W[i]});
    possible_heights[X[i]].push_back(Y[i]);
  }

  for(int i=0; i<N; i++) {
    possible_heights[i].push_back(0);
    possible_heights[i].push_back(N);
  }

  for(int i=0; i<N; i++) {
    sort(possible_heights[i].begin(), possible_heights[i].end());
  }

  for(int i=0; i<N; i++) sort(cs[i].begin(), cs[i].end());

  for(int i=0; i<N; i++) {
    for(int j=1; j<cs[i].size(); j++) {
      cs[i][j].second += cs[i][j-1].second;
    }
  }


  unordered_map<int, long long> DP[N][2];//0-> upwards, 1->downwards or plains

  for(int i=1; i<N; i++) {
    // State = 0: upwards (H[i-1] < H[i])
    {
      // H[i-1] > 0

      long long ptr = -1, qq = -5e14;
      for(int x: possible_heights[i]) {
        while(ptr + 1 < possible_heights[i-1].size() && possible_heights[i-1][ptr + 1] < x) {
          ptr++;
          int hh = possible_heights[i-1][ptr];
          if(hh > 0 || i == 1) qq = max(qq, DP[i-1][0][hh] - columnSum(i-1, hh-1)); // If i = 1, hh = 0 is ok
        }
        DP[i][0][x] = max(DP[i][0][x], qq + columnSum(i-1, x-1));
      }
      // H[i-1] = 0
      if(i > 1) {
        // y 0 x, y < x
        ptr = -1, qq = -5e14;
        for(int x: possible_heights[i]) {
          while(ptr + 1 < possible_heights[i-2].size() && possible_heights[i-2][ptr + 1] < x) {
            ptr++;
            int hh = possible_heights[i-2][ptr];
            long long vv = max(DP[i-2][0][hh], DP[i-2][1][hh]);
            qq = max(qq, vv);
          }
          DP[i][0][x] = max(DP[i][0][x], qq + columnSum(i-1, x-1));
        }
        // y 0 x, y >= x
        ptr = possible_heights[i-2].size(), qq = -5e14;
        reverse(possible_heights[i].begin(), possible_heights[i].end());
        for(int x: possible_heights[i]) {
          while(ptr - 1 >= 0 && possible_heights[i-2][ptr - 1] >= x) {
            ptr--;
            int hh = possible_heights[i-2][ptr];
            long long vv = max(DP[i-2][0][hh], DP[i-2][1][hh]);
            qq = max(qq, vv + columnSum(i-1, hh-1));
          }
          DP[i][0][x] = max(DP[i][0][x], qq);
        }
        reverse(possible_heights[i].begin(), possible_heights[i].end());
      }
    }
    // State = 1: downwards (H[i-1] >= H[i])
    {
      reverse(possible_heights[i].begin(), possible_heights[i].end());
      long long ptr = possible_heights[i-1].size(), qq = -5e14;
      for(int x: possible_heights[i]) {
        while(ptr - 1 >= 0 && possible_heights[i-1][ptr - 1] >= x) {
          ptr--;
          int hh = possible_heights[i-1][ptr];
          qq = max(qq, max(DP[i-1][0][hh], DP[i-1][1][hh]) + columnSum(i, hh-1));
        }
        DP[i][1][x] = max(DP[i][1][x], qq - columnSum(i, x-1));
      }
      reverse(possible_heights[i].begin(), possible_heights[i].end());
    }

    for(int x: possible_heights[i]) {
      DP[i][0][x] = max(DP[i][0][x], 0ll);
      DP[i][1][x] = max(DP[i][1][x], 0ll);
    }
  }

  long long ans = 0;
  for(int x: possible_heights[N-1]) ans = max(ans, max(DP[N-1][0][x], DP[N-1][1][x]));
  return ans;
}

Compilation message

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:48:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |     for(int j=1; j<cs[i].size(); j++) {
      |                  ~^~~~~~~~~~~~~
fish.cpp:63:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |         while(ptr + 1 < possible_heights[i-1].size() && possible_heights[i-1][ptr + 1] < x) {
      |               ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fish.cpp:75:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |           while(ptr + 1 < possible_heights[i-2].size() && possible_heights[i-2][ptr + 1] < x) {
      |                 ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 136 ms 58428 KB Output is correct
2 Correct 159 ms 66708 KB Output is correct
3 Correct 93 ms 53384 KB Output is correct
4 Correct 96 ms 53432 KB Output is correct
5 Correct 344 ms 94100 KB Output is correct
6 Correct 429 ms 87976 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 218 ms 68792 KB Output is correct
3 Correct 257 ms 80100 KB Output is correct
4 Correct 141 ms 58532 KB Output is correct
5 Correct 164 ms 66876 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Correct 3 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 4948 KB Output is correct
10 Correct 93 ms 53404 KB Output is correct
11 Correct 104 ms 53508 KB Output is correct
12 Correct 147 ms 58556 KB Output is correct
13 Correct 171 ms 66764 KB Output is correct
14 Correct 147 ms 58552 KB Output is correct
15 Correct 169 ms 65876 KB Output is correct
16 Correct 146 ms 58504 KB Output is correct
17 Correct 164 ms 65620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 93 ms 53420 KB Output is correct
2 Correct 100 ms 53492 KB Output is correct
3 Correct 123 ms 51496 KB Output is correct
4 Correct 117 ms 55640 KB Output is correct
5 Correct 171 ms 59036 KB Output is correct
6 Correct 172 ms 59720 KB Output is correct
7 Correct 168 ms 60304 KB Output is correct
8 Correct 172 ms 60300 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 5076 KB Output is correct
7 Correct 4 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 5076 KB Output is correct
10 Correct 4 ms 5332 KB Output is correct
11 Correct 3 ms 5076 KB Output is correct
12 Correct 4 ms 5204 KB Output is correct
13 Correct 3 ms 4948 KB Output is correct
14 Correct 5 ms 5204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 5076 KB Output is correct
7 Correct 4 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 5076 KB Output is correct
10 Correct 4 ms 5332 KB Output is correct
11 Correct 3 ms 5076 KB Output is correct
12 Correct 4 ms 5204 KB Output is correct
13 Correct 3 ms 4948 KB Output is correct
14 Correct 5 ms 5204 KB Output is correct
15 Correct 3 ms 5176 KB Output is correct
16 Correct 5 ms 5204 KB Output is correct
17 Correct 45 ms 11368 KB Output is correct
18 Correct 45 ms 12620 KB Output is correct
19 Correct 41 ms 12236 KB Output is correct
20 Correct 42 ms 12288 KB Output is correct
21 Correct 44 ms 12200 KB Output is correct
22 Correct 83 ms 19740 KB Output is correct
23 Correct 12 ms 6356 KB Output is correct
24 Correct 41 ms 9260 KB Output is correct
25 Correct 4 ms 5204 KB Output is correct
26 Correct 11 ms 6228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 5076 KB Output is correct
7 Correct 4 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 5076 KB Output is correct
10 Correct 4 ms 5332 KB Output is correct
11 Correct 3 ms 5076 KB Output is correct
12 Correct 4 ms 5204 KB Output is correct
13 Correct 3 ms 4948 KB Output is correct
14 Correct 5 ms 5204 KB Output is correct
15 Correct 3 ms 5176 KB Output is correct
16 Correct 5 ms 5204 KB Output is correct
17 Correct 45 ms 11368 KB Output is correct
18 Correct 45 ms 12620 KB Output is correct
19 Correct 41 ms 12236 KB Output is correct
20 Correct 42 ms 12288 KB Output is correct
21 Correct 44 ms 12200 KB Output is correct
22 Correct 83 ms 19740 KB Output is correct
23 Correct 12 ms 6356 KB Output is correct
24 Correct 41 ms 9260 KB Output is correct
25 Correct 4 ms 5204 KB Output is correct
26 Correct 11 ms 6228 KB Output is correct
27 Correct 7 ms 6688 KB Output is correct
28 Correct 212 ms 40120 KB Output is correct
29 Correct 292 ms 55380 KB Output is correct
30 Correct 322 ms 50660 KB Output is correct
31 Correct 326 ms 50700 KB Output is correct
32 Correct 284 ms 54864 KB Output is correct
33 Correct 333 ms 50692 KB Output is correct
34 Correct 321 ms 50028 KB Output is correct
35 Correct 120 ms 23244 KB Output is correct
36 Correct 327 ms 52720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 93 ms 53420 KB Output is correct
2 Correct 100 ms 53492 KB Output is correct
3 Correct 123 ms 51496 KB Output is correct
4 Correct 117 ms 55640 KB Output is correct
5 Correct 171 ms 59036 KB Output is correct
6 Correct 172 ms 59720 KB Output is correct
7 Correct 168 ms 60304 KB Output is correct
8 Correct 172 ms 60300 KB Output is correct
9 Correct 188 ms 65820 KB Output is correct
10 Correct 123 ms 38144 KB Output is correct
11 Correct 266 ms 71760 KB Output is correct
12 Correct 2 ms 4948 KB Output is correct
13 Correct 3 ms 4948 KB Output is correct
14 Correct 3 ms 4948 KB Output is correct
15 Correct 3 ms 4948 KB Output is correct
16 Correct 3 ms 4996 KB Output is correct
17 Correct 2 ms 4948 KB Output is correct
18 Correct 102 ms 53388 KB Output is correct
19 Correct 92 ms 53508 KB Output is correct
20 Correct 94 ms 53512 KB Output is correct
21 Correct 98 ms 53424 KB Output is correct
22 Correct 203 ms 66140 KB Output is correct
23 Correct 296 ms 76068 KB Output is correct
24 Correct 293 ms 78200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 136 ms 58428 KB Output is correct
2 Correct 159 ms 66708 KB Output is correct
3 Correct 93 ms 53384 KB Output is correct
4 Correct 96 ms 53432 KB Output is correct
5 Correct 344 ms 94100 KB Output is correct
6 Correct 429 ms 87976 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 218 ms 68792 KB Output is correct
9 Correct 257 ms 80100 KB Output is correct
10 Correct 141 ms 58532 KB Output is correct
11 Correct 164 ms 66876 KB Output is correct
12 Correct 3 ms 4948 KB Output is correct
13 Correct 3 ms 4948 KB Output is correct
14 Correct 3 ms 4948 KB Output is correct
15 Correct 3 ms 4948 KB Output is correct
16 Correct 93 ms 53404 KB Output is correct
17 Correct 104 ms 53508 KB Output is correct
18 Correct 147 ms 58556 KB Output is correct
19 Correct 171 ms 66764 KB Output is correct
20 Correct 147 ms 58552 KB Output is correct
21 Correct 169 ms 65876 KB Output is correct
22 Correct 146 ms 58504 KB Output is correct
23 Correct 164 ms 65620 KB Output is correct
24 Correct 93 ms 53420 KB Output is correct
25 Correct 100 ms 53492 KB Output is correct
26 Correct 123 ms 51496 KB Output is correct
27 Correct 117 ms 55640 KB Output is correct
28 Correct 171 ms 59036 KB Output is correct
29 Correct 172 ms 59720 KB Output is correct
30 Correct 168 ms 60304 KB Output is correct
31 Correct 172 ms 60300 KB Output is correct
32 Correct 2 ms 4948 KB Output is correct
33 Correct 2 ms 4948 KB Output is correct
34 Correct 3 ms 4948 KB Output is correct
35 Correct 3 ms 4948 KB Output is correct
36 Correct 3 ms 4948 KB Output is correct
37 Correct 3 ms 5076 KB Output is correct
38 Correct 4 ms 4948 KB Output is correct
39 Correct 3 ms 4948 KB Output is correct
40 Correct 3 ms 5076 KB Output is correct
41 Correct 4 ms 5332 KB Output is correct
42 Correct 3 ms 5076 KB Output is correct
43 Correct 4 ms 5204 KB Output is correct
44 Correct 3 ms 4948 KB Output is correct
45 Correct 5 ms 5204 KB Output is correct
46 Correct 3 ms 5176 KB Output is correct
47 Correct 5 ms 5204 KB Output is correct
48 Correct 45 ms 11368 KB Output is correct
49 Correct 45 ms 12620 KB Output is correct
50 Correct 41 ms 12236 KB Output is correct
51 Correct 42 ms 12288 KB Output is correct
52 Correct 44 ms 12200 KB Output is correct
53 Correct 83 ms 19740 KB Output is correct
54 Correct 12 ms 6356 KB Output is correct
55 Correct 41 ms 9260 KB Output is correct
56 Correct 4 ms 5204 KB Output is correct
57 Correct 11 ms 6228 KB Output is correct
58 Correct 7 ms 6688 KB Output is correct
59 Correct 212 ms 40120 KB Output is correct
60 Correct 292 ms 55380 KB Output is correct
61 Correct 322 ms 50660 KB Output is correct
62 Correct 326 ms 50700 KB Output is correct
63 Correct 284 ms 54864 KB Output is correct
64 Correct 333 ms 50692 KB Output is correct
65 Correct 321 ms 50028 KB Output is correct
66 Correct 120 ms 23244 KB Output is correct
67 Correct 327 ms 52720 KB Output is correct
68 Correct 188 ms 65820 KB Output is correct
69 Correct 123 ms 38144 KB Output is correct
70 Correct 266 ms 71760 KB Output is correct
71 Correct 2 ms 4948 KB Output is correct
72 Correct 3 ms 4948 KB Output is correct
73 Correct 3 ms 4948 KB Output is correct
74 Correct 3 ms 4948 KB Output is correct
75 Correct 3 ms 4996 KB Output is correct
76 Correct 2 ms 4948 KB Output is correct
77 Correct 102 ms 53388 KB Output is correct
78 Correct 92 ms 53508 KB Output is correct
79 Correct 94 ms 53512 KB Output is correct
80 Correct 98 ms 53424 KB Output is correct
81 Correct 203 ms 66140 KB Output is correct
82 Correct 296 ms 76068 KB Output is correct
83 Correct 293 ms 78200 KB Output is correct
84 Correct 452 ms 90768 KB Output is correct
85 Correct 444 ms 93072 KB Output is correct
86 Correct 453 ms 83788 KB Output is correct
87 Correct 442 ms 88196 KB Output is correct
88 Correct 2 ms 4996 KB Output is correct
89 Correct 441 ms 89024 KB Output is correct
90 Correct 397 ms 88312 KB Output is correct
91 Correct 371 ms 89952 KB Output is correct