Submission #931116

#TimeUsernameProblemLanguageResultExecution timeMemory
931116caterpillowCake 3 (JOI19_cake3)C++17
24 / 100
4041 ms8032 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using pl = pair<ll,ll>;
#define vt vector
#define f first
#define s second
#define all(x) x.begin(), x.end() 
#define pb push_back
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define ROF(i,a,b) for(int i=(b)-1;i>=(a);--i)
#define F0R(i, b) FOR(i, 0, b)
#define endl '\n'
#define debug(x) do{auto _x = x; cerr << #x << " = " << _x << endl;} while(0)
const ll INF = 1e18;

/*

its always optimal to arrange your chosen cake slices monotonically

n <= 2000:
    - sort all slices by increasing colour
    - for each L, answer the best value u can get for all R
        - iterate through R with a priority queue of cake values
        - replace cake whenever u reach a better one
    - n^2 log n

*/

ll n, m;
vt<pl> cakes;

main() {
    cin.tie(0)->sync_with_stdio(0);
    
    cin >> n >> m;
    cakes.resize(n); F0R (i, n) cin >> cakes[i].s >> cakes[i].f;
    sort(all(cakes)); // colour, value

    ll best = -INF;
    F0R (l, n) {
        ll tot = cakes[l].s;
        priority_queue<ll, vt<ll>, greater<ll>> pq;
        FOR (r, l + 1, n) {
            tot += cakes[r].s;
            if (pq.size() + 2 > m) {
                tot -= pq.top();
                pq.pop();
            }
            pq.push({cakes[r].s});
            if (pq.size() + 1 == m) {
                best = max(best, tot - 2 * (cakes[r].f - cakes[l].f));
            }
        }
    }
    cout << best << endl;
}

Compilation message (stderr)

cake3.cpp:35:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   35 | main() {
      | ^~~~
cake3.cpp: In function 'int main()':
cake3.cpp:48:31: warning: comparison of integer expressions of different signedness: 'std::priority_queue<long long int, std::vector<long long int>, std::greater<long long int> >::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   48 |             if (pq.size() + 2 > m) {
      |                 ~~~~~~~~~~~~~~^~~
cake3.cpp:53:31: warning: comparison of integer expressions of different signedness: 'std::priority_queue<long long int, std::vector<long long int>, std::greater<long long int> >::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   53 |             if (pq.size() + 1 == m) {
      |                 ~~~~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...