Submission #1306473

#TimeUsernameProblemLanguageResultExecution timeMemory
1306473anangoFestival (IOI25_festival)C++20
24 / 100
54 ms10016 KiB
#include "festival.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
int INF = 1LL<<60;

std::vector<signed> max_coupons(signed A, std::vector<signed> P, std::vector<signed> T) {
    //cost, index
    int n = P.size();
    vector<vector<pair<int,int>>> coupons(5);
    for (int i=0; i<n; i++) {
        coupons[T[i]].push_back({P[i], i});
    }
    for (int i=1; i<5; i++) {
        sort(coupons[i].begin(), coupons[i].end());
    }
    vector<vector<int>> prefsums(5);
    for (int i=1; i<5; i++) {
        prefsums[i] = vector<int>(coupons[i].size() + 1, 0);
        for (int j=0; j<coupons[i].size(); j++) {
            prefsums[i][j+1] = prefsums[i][j] + coupons[i][j].first;
        }
    }
    auto get_num_type_1 = [&prefsums] (int money) {
        return upper_bound(prefsums[1].begin(), prefsums[1].end(), money) - prefsums[1].begin() - 1;
    };
    //first 3 subtasks
    int best_overall_count = -1;
    int best_type_2_count = -1;
    int money = A;
    for (int i=0; i<=coupons[2].size(); i++) {
        int type_2_count = i;
        int type_1_count = get_num_type_1(money);
        int totcount = type_2_count + type_1_count;
        if (totcount > best_overall_count) {
            best_overall_count = totcount;
            best_type_2_count = type_2_count;
        }
        if (i<coupons[2].size()) {
            money = (money - coupons[2][i].first) * 2;
        }
        if (money <= 0) break;
        money = min(money, INF);
    }
    //cout << "SOLVED " << best_type_2_count << " " << best_overall_count << endl;
    vector<signed> answers;
    for (int i=0; i<best_type_2_count; i++) {
        answers.push_back(coupons[2][i].second);
    }
    for (int i=0; i<best_overall_count-best_type_2_count; i++) {
        answers.push_back(coupons[1][i].second);
    }
    return answers;
}
#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...