Submission #1253986

#TimeUsernameProblemLanguageResultExecution timeMemory
1253986countlessFestival (IOI25_festival)C++20
24 / 100
689 ms9388 KiB
#include "festival.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

#define sp <<" "<<
#define endl "\n"

vector<int> max_coupons(int A, vector<int> P, vector<int> T) {
    int N = P.size();

    vector<int> o, t;
    for (int i = 0; i < N; i++) {
        if (T[i] == 1) o.emplace_back(i);
        else t.emplace_back(i);
    }

    sort(o.begin(), o.end(), [&](int i, int j) {
        return P[i] < P[j];
    });
    vector<ld> pref;
    for (auto &i : o) {
        if (pref.empty()) pref.emplace_back(P[i]);
        else pref.emplace_back(pref.back() + P[i]);
    }

    sort(t.begin(), t.end(), [&](int i, int j) {
        return P[i] < P[j];
    });

    int M = t.size();
    // we take some prefix of o and some prefix of t
    ld have = A;
    int best = upper_bound(pref.begin(), pref.end(), have) - pref.begin() - 1;
    int ind = -1, oth = upper_bound(pref.begin(), pref.end(), have) - pref.begin();
    cerr << best sp o.size() sp t.size() << endl;
    for (int i = 0; i < M; i++) {
        if (have < P[t[i]]) break;
        have = ld(2) * (have - P[t[i]]);
        if (i >= 32) cerr << have sp P[t[i]] << endl;
        if (have < 0) break;

        int cand = i + upper_bound(pref.begin(), pref.end(), have) - pref.begin() - 1;
        if (cand > best) {
            best = cand;
            ind = i;
            oth = upper_bound(pref.begin(), pref.end(), have) - pref.begin();
        }
    }

    vector<int> ans;
    if (ind == -1) {
        for (int i = 0; i < oth; i++) {
            ans.emplace_back(o[i]);
        }
    } else {
        for (int i = 0; i <= ind; i++) {
            ans.emplace_back(t[i]);
        }

        for (int i = 0; i < oth; i++) {
            ans.emplace_back(o[i]);
        }
    }
    return ans;
}
#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...