Submission #1328231

#TimeUsernameProblemLanguageResultExecution timeMemory
1328231orgiloogiiHoliday (IOI14_holiday)C++20
23 / 100
11 ms1432 KiB
#include "holiday.h"
#include <bits/stdc++.h>
using namespace std;

long long int sub2(int n, int start, int d, int attraction[]) {
    priority_queue<int, vector <int>, greater<int>> pq;
    int i;
    int sum = 0;
    if (d % 2 == 1) {
        for (i = 0;i < min((d + 1) / 2, n);i++) {
            sum += attraction[i];
            pq.push(attraction[i]);
        }
        int cnt = 0;
        int ans = sum;
        while (pq.size() > 0 && i < n) {
            int x = pq.top();
            // cout << x << "\n";
            sum -= x;
            pq.pop();
            cnt ^= 1;
            if (cnt) {
                continue;
            }
            sum += attraction[i];
            pq.push(attraction[i]);
            ans = max(ans, sum);
            i++;
        }
        return ans;
    }
    else {
        for (i = 0;i < min((d + 1) / 2, n);i++) {
            sum += attraction[i];
            pq.push(attraction[i]);
        }
        int cnt = 0;
        int ans = sum;
        while (pq.size() > 0 && i < n) {
            int x = pq.top();
            // cout << x << "\n";
            sum -= x;
            pq.pop();
            cnt ^= 1;
            if (!cnt) {
                continue;
            }
            sum += attraction[i];
            pq.push(attraction[i]);
            ans = max(ans, sum);
            i++;
        }
        return ans;
    }
    return 0;
}

long long int maxSum(priority_queue <int> pq1, int req) {
    int res = 0;
    while (req > 0 && !pq1.empty()) {
        res += pq1.top();
        req--;
        pq1.pop();
    }
    return res;
}

long long int findMaxAttraction(int n, int start, int d, int attraction[]) {
    int mx = 0;
    for (int i = 0;i < n;i++) {
        mx = max(mx, attraction[i]);
    }
    if (mx <= 100 && start == 0) {
        return sub2(n, start, d, attraction);
    }
    priority_queue <int> pq;
    long long res = 0;
    for (int l = start;l >= 0;l--) {
        pq.push(attraction[l]);
        priority_queue <int> pq1 = pq;
        for (int r = start + 1;r < n;r++) {
            pq1.push(attraction[r]);
            int req = d - (r - l + min(start - l, r - start));
            if (req < 0) break;
            // cout << l << " " << r << " " << req << ' ' << (r - l + min(start - l, r - start)) << ' ' << maxSum(pq1, req) << endl;
            res = max(res, maxSum(pq1, req));
        }
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...