Submission #639568

#TimeUsernameProblemLanguageResultExecution timeMemory
639568SlavicGCatfish Farm (IOI22_fish)C++17
100 / 100
810 ms129968 KiB
#include "fish.h"
#include "bits/stdc++.h"
using namespace std;
using ll = long long;

const ll inf = 1e16;
long long max_weights(int n, int m, vector<int> x, vector<int> y, vector<int> w) {
    vector<vector<pair<ll, ll>>> p(n);
    vector<int> len[n];
    for(int i = 0; i < m; ++i) {
        p[x[i]].push_back({y[i], w[i]});
        len[x[i]].push_back(y[i]);
    }
    for(int i = 0; i < n; ++i) {
        sort(p[i].begin(), p[i].end());
        ll sum = 0;
        for(int j = 0; j < p[i].size(); ++j) {
            sum += p[i][j].second;
            p[i][j].second = sum;
        }
        p[i].insert(p[i].begin(), make_pair(-1, 0));
    }
    for(int i = 0; i < n; ++i) {
        len[i].push_back(n);
        len[i].push_back(0);
        sort(len[i].begin(), len[i].end());
        len[i].erase(unique(len[i].begin(), len[i].end()), len[i].end());
    }
    map<ll, ll> dp[n + 1][2];
    for(int i = 0; i <= n; ++i) {
        dp[0][0][i] = dp[0][1][i] = 0;
    }

    //0 - increasing, 1 - decreasing
    for(int i = 1; i < n; ++i) {
        vector<pair<ll, ll>> mx0, mx1;
        for(ll lastlen: len[i - 1]) {
            dp[i][0][0] = max({dp[i][0][0], dp[i - 1][0][lastlen], dp[i - 1][1][lastlen]});
            dp[i][1][0] = max({dp[i][1][0], dp[i - 1][0][lastlen], dp[i - 1][1][lastlen]});

            ll cur = 0;
            if(!mx0.empty()) cur = mx0.back().second;
            auto paiu = upper_bound(p[i - 1].begin(), p[i - 1].end(), make_pair(lastlen - 1, LLONG_MAX)); --paiu;
            cur = max(cur, dp[i - 1][0][lastlen] - paiu->second);
            mx0.push_back({lastlen, cur});
        }

        reverse(len[i - 1].begin(), len[i - 1].end());

        for(ll lastlen: len[i - 1]) {
            ll cur = 0;
            if(!mx1.empty()) cur = mx1.back().second;
            auto paiu = upper_bound(p[i].begin(), p[i].end(), make_pair(lastlen - 1, LLONG_MAX)); --paiu;
            cur = max(cur, dp[i - 1][0][lastlen] + paiu->second);
            cur = max(cur, dp[i - 1][1][lastlen] + paiu->second);
            mx1.push_back({lastlen, cur});
        }
        reverse(mx1.begin(), mx1.end());
        for(ll curlen: len[i]) {
            auto it1 = upper_bound(mx0.begin(), mx0.end(), make_pair(curlen, LLONG_MAX));
            assert(it1 != mx0.begin()); --it1;
            auto it2 = lower_bound(mx1.begin(), mx1.end(), make_pair(curlen, LLONG_MIN));
            assert(it2 != mx1.end());

            auto paiu = upper_bound(p[i - 1].begin(), p[i - 1].end(), make_pair(curlen - 1, LLONG_MAX)); --paiu;
            dp[i][0][curlen] = max(dp[i][0][curlen], paiu->second + it1->second);

            auto paiu2 = upper_bound(p[i].begin(), p[i].end(), make_pair(curlen - 1, LLONG_MAX)); --paiu2;
            dp[i][1][curlen] = max(dp[i][1][curlen], it2->second - paiu2->second);
        }
    }
    ll ans = 0;
    for(int i = 0; i <= n; ++i) {
        ans = max({ans, dp[n - 1][0][i], dp[n - 1][1][i]});
    }
    return ans;
}
/*
5 4
0 2 5
1 1 2
4 4 1
3 3 3
*/

Compilation message (stderr)

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:17:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |         for(int j = 0; j < p[i].size(); ++j) {
      |                        ~~^~~~~~~~~~~~~
#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...