Submission #656432

# Submission time Handle Problem Language Result Execution time Memory
656432 2022-11-07T13:20:20 Z Lobo Catfish Farm (IOI22_fish) C++17
100 / 100
892 ms 224816 KB
#include "fish.h"
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3","unroll-loops")
// #define int long long
#define ll long long
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define all(x) x.begin(),x.end()

const int maxn = 1e5+10;
// const int inf = 1e18+10;

int n, m;
vector<vector<ll>> dp[maxn];
map<int,ll> pf[maxn], pfmx0[maxn], pfmx1[maxn], sfmx0[maxn];
vector<pair<int,int>> fish[maxn]; // fishs from column i
vector<int> hr[maxn]; // important heights from column i, the ones that can be chosen

long long max_weights(int32_t N, int32_t M, vector<int32_t> X, vector<int32_t> Y, vector<int32_t> W) {
    n = N;
    m = M;

    for(int i = 0; i < m; i++) {
        fish[X[i]+1].pb(mp(Y[i]+1,W[i]));
        hr[X[i]+1].pb(Y[i]);
    }

    for(int i = 0; i <= n; i++) {
        hr[i].pb(0);
        hr[i].pb(n);
        sort(all(hr[i]));
        sort(all(fish[i]));
        hr[i].erase(unique(all(hr[i])),hr[i].end());
        // Store only the relevant heights

        for(int j = 0; j < hr[i].size(); j++) {
            dp[i].pb({0,0});
        }
    }

    for(int i = 1; i <= n; i++) {
        for(auto j : hr[i]) pf[i][j] = 0;

        for(auto aux : fish[i]) {
            int y = aux.fr;
            int w = aux.sc;
            pf[i][y]+= w;
        }
        // Do a prefix sum on the weight of the fishs
        pf[i][0] = 0;
        for(auto it = next(pf[i].begin()); it != pf[i].end(); it++) {
            it->sc+= prev(it)->sc;
        }
    }

    // dp[i][h0][0/1] = until i, with h[i] = hr[i][h0] 
    // and it's greater/smaller tha the previous

    // dp[1][h0][0/1] = 0
    for(int h0 = 0; h0 < hr[1].size(); h0++) {
        dp[1][h0][0] = 0;
        dp[1][h0][1] = 0;
        pfmx0[1][hr[1][h0]] = max(pfmx0[1][hr[1][h0]],dp[1][h0][0]-pf[1][hr[1][h0]]);
        sfmx0[1][hr[1][h0]] = max(sfmx0[1][hr[1][h0]],dp[1][h0][0]+pf[1+1][hr[1][h0]]);
        sfmx0[1][hr[1][h0]] = max(sfmx0[1][hr[1][h0]],dp[1][h0][1]+pf[1+1][hr[1][h0]]);
    }

    for(auto it = next(pfmx0[1].begin()); it != pfmx0[1].end(); it++) {
        it->sc = max(it->sc,prev(it)->sc);
    }
    auto it = prev(prev(sfmx0[1].end()));
    while(true) {
        it->sc = max(it->sc,next(it)->sc);
        if(it == sfmx0[1].begin()) break;
        it = prev(it);
    }

    for(int i = 2; i <= n; i++) {
        for(int h0 = 0; h0 < hr[i].size(); h0++) {
            // It's greater than the previous
            auto it = prev(upper_bound(all(hr[i-1]),hr[i][h0]));
            auto itpfh1 = prev(pf[i-1].upper_bound(hr[i][h0]));
            dp[i][h0][0] = pfmx0[i-1][*it] + itpfh1->sc;

            if(i != 2) {
                it = prev(upper_bound(all(hr[i-2]),hr[i][h0]));
                dp[i][h0][0] = max(dp[i][h0][0],pfmx1[i-2][*it] + itpfh1->sc);
            }

            // It's smaller than the previous
            it = lower_bound(all(hr[i-1]),hr[i][h0]);
            auto itpfh0 = prev(pf[i].upper_bound(hr[i][h0]));
            dp[i][h0][1] = sfmx0[i-1][*it] - itpfh0->sc;

            if(i == n) continue;
            auto itpfh11 = prev(pf[i+1].upper_bound(hr[i][h0]));

            pfmx0[i][hr[i][h0]] = max(pfmx0[i][hr[i][h0]],dp[i][h0][0]-pf[i][hr[i][h0]]);
            pfmx1[i][hr[i][h0]] = max(pfmx1[i][hr[i][h0]],max(dp[i][h0][1],dp[i][h0][0]));
            sfmx0[i][hr[i][h0]] = max(sfmx0[i][hr[i][h0]],max(dp[i][h0][0],dp[i][h0][1])+itpfh11->sc);
        }
        if(i == n) continue;
        for(auto it = next(pfmx0[i].begin()); it != pfmx0[i].end(); it++) {
            it->sc = max(it->sc,prev(it)->sc);
        }
        for(auto it = next(pfmx1[i].begin()); it != pfmx1[i].end(); it++) {
            it->sc = max(it->sc,prev(it)->sc);
        }
        auto it = prev(prev(sfmx0[i].end()));
        while(true) {
            it->sc = max(it->sc,next(it)->sc);
            if(it == sfmx0[i].begin()) break;
            it = prev(it);
        }
    }

    ll ans = 0;
    for(int h0 = 0; h0 < hr[n].size(); h0++) {
        ans = max(ans, dp[n][h0][0]);
        ans = max(ans, dp[n][h0][1]);
    }
    return ans;
}

Compilation message

fish.cpp: In function 'long long int max_weights(int32_t, int32_t, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:39:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |         for(int j = 0; j < hr[i].size(); j++) {
      |                        ~~^~~~~~~~~~~~~~
fish.cpp:63:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for(int h0 = 0; h0 < hr[1].size(); h0++) {
      |                     ~~~^~~~~~~~~~~~~~
fish.cpp:82:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |         for(int h0 = 0; h0 < hr[i].size(); h0++) {
      |                         ~~~^~~~~~~~~~~~~~
fish.cpp:121:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |     for(int h0 = 0; h0 < hr[n].size(); h0++) {
      |                     ~~~^~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 277 ms 113204 KB Output is correct
2 Correct 348 ms 125936 KB Output is correct
3 Correct 109 ms 91868 KB Output is correct
4 Correct 111 ms 91980 KB Output is correct
5 Correct 862 ms 196136 KB Output is correct
6 Correct 560 ms 224816 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 26068 KB Output is correct
2 Correct 487 ms 136452 KB Output is correct
3 Correct 588 ms 153752 KB Output is correct
4 Correct 296 ms 113216 KB Output is correct
5 Correct 326 ms 125868 KB Output is correct
6 Correct 13 ms 26068 KB Output is correct
7 Correct 13 ms 26068 KB Output is correct
8 Correct 13 ms 26096 KB Output is correct
9 Correct 14 ms 26136 KB Output is correct
10 Correct 109 ms 91820 KB Output is correct
11 Correct 136 ms 91780 KB Output is correct
12 Correct 270 ms 113404 KB Output is correct
13 Correct 328 ms 125856 KB Output is correct
14 Correct 267 ms 113332 KB Output is correct
15 Correct 293 ms 120364 KB Output is correct
16 Correct 296 ms 113376 KB Output is correct
17 Correct 322 ms 123068 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 109 ms 91840 KB Output is correct
2 Correct 110 ms 91896 KB Output is correct
3 Correct 148 ms 91536 KB Output is correct
4 Correct 147 ms 96040 KB Output is correct
5 Correct 191 ms 103600 KB Output is correct
6 Correct 183 ms 103532 KB Output is correct
7 Correct 185 ms 103628 KB Output is correct
8 Correct 190 ms 103516 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 26068 KB Output is correct
2 Correct 17 ms 26144 KB Output is correct
3 Correct 14 ms 26108 KB Output is correct
4 Correct 14 ms 26068 KB Output is correct
5 Correct 13 ms 26068 KB Output is correct
6 Correct 13 ms 26068 KB Output is correct
7 Correct 13 ms 26068 KB Output is correct
8 Correct 13 ms 26020 KB Output is correct
9 Correct 16 ms 26324 KB Output is correct
10 Correct 15 ms 27092 KB Output is correct
11 Correct 14 ms 26508 KB Output is correct
12 Correct 15 ms 26708 KB Output is correct
13 Correct 15 ms 26196 KB Output is correct
14 Correct 15 ms 26592 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 26068 KB Output is correct
2 Correct 17 ms 26144 KB Output is correct
3 Correct 14 ms 26108 KB Output is correct
4 Correct 14 ms 26068 KB Output is correct
5 Correct 13 ms 26068 KB Output is correct
6 Correct 13 ms 26068 KB Output is correct
7 Correct 13 ms 26068 KB Output is correct
8 Correct 13 ms 26020 KB Output is correct
9 Correct 16 ms 26324 KB Output is correct
10 Correct 15 ms 27092 KB Output is correct
11 Correct 14 ms 26508 KB Output is correct
12 Correct 15 ms 26708 KB Output is correct
13 Correct 15 ms 26196 KB Output is correct
14 Correct 15 ms 26592 KB Output is correct
15 Correct 16 ms 26452 KB Output is correct
16 Correct 17 ms 26848 KB Output is correct
17 Correct 97 ms 42524 KB Output is correct
18 Correct 92 ms 42916 KB Output is correct
19 Correct 81 ms 42588 KB Output is correct
20 Correct 79 ms 42640 KB Output is correct
21 Correct 85 ms 42652 KB Output is correct
22 Correct 167 ms 58792 KB Output is correct
23 Correct 28 ms 29900 KB Output is correct
24 Correct 61 ms 37924 KB Output is correct
25 Correct 17 ms 26676 KB Output is correct
26 Correct 25 ms 29612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 26068 KB Output is correct
2 Correct 17 ms 26144 KB Output is correct
3 Correct 14 ms 26108 KB Output is correct
4 Correct 14 ms 26068 KB Output is correct
5 Correct 13 ms 26068 KB Output is correct
6 Correct 13 ms 26068 KB Output is correct
7 Correct 13 ms 26068 KB Output is correct
8 Correct 13 ms 26020 KB Output is correct
9 Correct 16 ms 26324 KB Output is correct
10 Correct 15 ms 27092 KB Output is correct
11 Correct 14 ms 26508 KB Output is correct
12 Correct 15 ms 26708 KB Output is correct
13 Correct 15 ms 26196 KB Output is correct
14 Correct 15 ms 26592 KB Output is correct
15 Correct 16 ms 26452 KB Output is correct
16 Correct 17 ms 26848 KB Output is correct
17 Correct 97 ms 42524 KB Output is correct
18 Correct 92 ms 42916 KB Output is correct
19 Correct 81 ms 42588 KB Output is correct
20 Correct 79 ms 42640 KB Output is correct
21 Correct 85 ms 42652 KB Output is correct
22 Correct 167 ms 58792 KB Output is correct
23 Correct 28 ms 29900 KB Output is correct
24 Correct 61 ms 37924 KB Output is correct
25 Correct 17 ms 26676 KB Output is correct
26 Correct 25 ms 29612 KB Output is correct
27 Correct 19 ms 29456 KB Output is correct
28 Correct 407 ms 105848 KB Output is correct
29 Correct 623 ms 136116 KB Output is correct
30 Correct 510 ms 150608 KB Output is correct
31 Correct 565 ms 150704 KB Output is correct
32 Correct 546 ms 133356 KB Output is correct
33 Correct 532 ms 151252 KB Output is correct
34 Correct 525 ms 151276 KB Output is correct
35 Correct 197 ms 74316 KB Output is correct
36 Correct 575 ms 150488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 109 ms 91840 KB Output is correct
2 Correct 110 ms 91896 KB Output is correct
3 Correct 148 ms 91536 KB Output is correct
4 Correct 147 ms 96040 KB Output is correct
5 Correct 191 ms 103600 KB Output is correct
6 Correct 183 ms 103532 KB Output is correct
7 Correct 185 ms 103628 KB Output is correct
8 Correct 190 ms 103516 KB Output is correct
9 Correct 279 ms 136492 KB Output is correct
10 Correct 150 ms 82388 KB Output is correct
11 Correct 304 ms 138852 KB Output is correct
12 Correct 15 ms 26124 KB Output is correct
13 Correct 13 ms 26056 KB Output is correct
14 Correct 15 ms 26068 KB Output is correct
15 Correct 14 ms 26068 KB Output is correct
16 Correct 15 ms 26140 KB Output is correct
17 Correct 15 ms 26068 KB Output is correct
18 Correct 114 ms 91892 KB Output is correct
19 Correct 109 ms 91800 KB Output is correct
20 Correct 114 ms 91900 KB Output is correct
21 Correct 111 ms 91840 KB Output is correct
22 Correct 287 ms 133708 KB Output is correct
23 Correct 383 ms 165312 KB Output is correct
24 Correct 372 ms 167008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 277 ms 113204 KB Output is correct
2 Correct 348 ms 125936 KB Output is correct
3 Correct 109 ms 91868 KB Output is correct
4 Correct 111 ms 91980 KB Output is correct
5 Correct 862 ms 196136 KB Output is correct
6 Correct 560 ms 224816 KB Output is correct
7 Correct 14 ms 26068 KB Output is correct
8 Correct 487 ms 136452 KB Output is correct
9 Correct 588 ms 153752 KB Output is correct
10 Correct 296 ms 113216 KB Output is correct
11 Correct 326 ms 125868 KB Output is correct
12 Correct 13 ms 26068 KB Output is correct
13 Correct 13 ms 26068 KB Output is correct
14 Correct 13 ms 26096 KB Output is correct
15 Correct 14 ms 26136 KB Output is correct
16 Correct 109 ms 91820 KB Output is correct
17 Correct 136 ms 91780 KB Output is correct
18 Correct 270 ms 113404 KB Output is correct
19 Correct 328 ms 125856 KB Output is correct
20 Correct 267 ms 113332 KB Output is correct
21 Correct 293 ms 120364 KB Output is correct
22 Correct 296 ms 113376 KB Output is correct
23 Correct 322 ms 123068 KB Output is correct
24 Correct 109 ms 91840 KB Output is correct
25 Correct 110 ms 91896 KB Output is correct
26 Correct 148 ms 91536 KB Output is correct
27 Correct 147 ms 96040 KB Output is correct
28 Correct 191 ms 103600 KB Output is correct
29 Correct 183 ms 103532 KB Output is correct
30 Correct 185 ms 103628 KB Output is correct
31 Correct 190 ms 103516 KB Output is correct
32 Correct 14 ms 26068 KB Output is correct
33 Correct 17 ms 26144 KB Output is correct
34 Correct 14 ms 26108 KB Output is correct
35 Correct 14 ms 26068 KB Output is correct
36 Correct 13 ms 26068 KB Output is correct
37 Correct 13 ms 26068 KB Output is correct
38 Correct 13 ms 26068 KB Output is correct
39 Correct 13 ms 26020 KB Output is correct
40 Correct 16 ms 26324 KB Output is correct
41 Correct 15 ms 27092 KB Output is correct
42 Correct 14 ms 26508 KB Output is correct
43 Correct 15 ms 26708 KB Output is correct
44 Correct 15 ms 26196 KB Output is correct
45 Correct 15 ms 26592 KB Output is correct
46 Correct 16 ms 26452 KB Output is correct
47 Correct 17 ms 26848 KB Output is correct
48 Correct 97 ms 42524 KB Output is correct
49 Correct 92 ms 42916 KB Output is correct
50 Correct 81 ms 42588 KB Output is correct
51 Correct 79 ms 42640 KB Output is correct
52 Correct 85 ms 42652 KB Output is correct
53 Correct 167 ms 58792 KB Output is correct
54 Correct 28 ms 29900 KB Output is correct
55 Correct 61 ms 37924 KB Output is correct
56 Correct 17 ms 26676 KB Output is correct
57 Correct 25 ms 29612 KB Output is correct
58 Correct 19 ms 29456 KB Output is correct
59 Correct 407 ms 105848 KB Output is correct
60 Correct 623 ms 136116 KB Output is correct
61 Correct 510 ms 150608 KB Output is correct
62 Correct 565 ms 150704 KB Output is correct
63 Correct 546 ms 133356 KB Output is correct
64 Correct 532 ms 151252 KB Output is correct
65 Correct 525 ms 151276 KB Output is correct
66 Correct 197 ms 74316 KB Output is correct
67 Correct 575 ms 150488 KB Output is correct
68 Correct 279 ms 136492 KB Output is correct
69 Correct 150 ms 82388 KB Output is correct
70 Correct 304 ms 138852 KB Output is correct
71 Correct 15 ms 26124 KB Output is correct
72 Correct 13 ms 26056 KB Output is correct
73 Correct 15 ms 26068 KB Output is correct
74 Correct 14 ms 26068 KB Output is correct
75 Correct 15 ms 26140 KB Output is correct
76 Correct 15 ms 26068 KB Output is correct
77 Correct 114 ms 91892 KB Output is correct
78 Correct 109 ms 91800 KB Output is correct
79 Correct 114 ms 91900 KB Output is correct
80 Correct 111 ms 91840 KB Output is correct
81 Correct 287 ms 133708 KB Output is correct
82 Correct 383 ms 165312 KB Output is correct
83 Correct 372 ms 167008 KB Output is correct
84 Correct 892 ms 209116 KB Output is correct
85 Correct 875 ms 215012 KB Output is correct
86 Correct 535 ms 216600 KB Output is correct
87 Correct 590 ms 224636 KB Output is correct
88 Correct 13 ms 26068 KB Output is correct
89 Correct 675 ms 224676 KB Output is correct
90 Correct 633 ms 213116 KB Output is correct
91 Correct 573 ms 202736 KB Output is correct