Submission #1252481

#TimeUsernameProblemLanguageResultExecution timeMemory
1252481NekoRollyFestival (IOI25_festival)C++20
54 / 100
124 ms15400 KiB
#include "festival.h"
#include<bits/stdc++.h>
using namespace std;

#define sz(x) int(x.size())

typedef long long ll;
typedef pair<ll,ll> pll;

struct coupon{
    ll p,t,id;
};

bool comp(coupon A,coupon B){ // *{P[i], T[i]}
    auto [p, a, ida] = A;
    auto [q, b, idb] = B;
    if (a == b) return p <= q;
    if (a == 1 || b == 1) return b == 1;
    return a*b*p + b*q <= a*b*q + a*p;
}

vector<int> max_coupons(int _A,vector<int> P,vector<int> T){
    int n = P.size(), max_t = 0;
    ll A = _A;
    coupon a[n];

    ll sum = 0;
    for (int i=0; i<n; i++){
        a[i] = {P[i], T[i], i};
        max_t = max(max_t, T[i]);
        sum += P[i];
    }

    sort(a, a+n, comp);
    vector<int> vans;

    if (max_t <= 2){
        vector<coupon> v1,v2;
        for (int i=0; i<n; i++){
            if (a[i].t == 1)
                v1.push_back(a[i]);
            else
                v2.push_back(a[i]);
        }

        int m = v1.size();
        ll pr[m+1];
        pr[0] = 0;
        for (int i=1; i<=m; i++)
            pr[i] = pr[i-1] + v1[i-1].p;

        ll aux = A;
        int ans = 0, best=-1;
        for (int i=-1; i<n-m; i++){
            if (i != -1) A = 2*(A - v2[i].p);
            if (A < 0) break;
            if (A >= sum){
                for (int i=0; i<n; i++)
                    vans.push_back(a[i].id);
                return vans;
            }
            int val = i;
            val += upper_bound(pr, pr+m, A) - pr;
            if (ans <= val) ans = val, best = i;
        }

        A = aux;
        for (int i=0; i<=best; i++){
            vans.push_back(v2[i].id);
            A = 2*(A - v2[i].p);
        }

        for (int i=0; i<m; i++){
            if (A < v1[i].p) break;
            A -= v1[i].p;
            vans.push_back(v1[i].id);
        }

        return vans;
    }
    else if (n <= 70){
        vector<int> pos[5];
        for (int i=0; i<n; i++)
            pos[a[i].t].push_back(i);

        ll aux = A;
        for (int i2=0; i2<=sz(pos[2]); i2++)
            for (int i3=0; i3<=sz(pos[3]); i3++)
                for (int i4=0; i4<=sz(pos[4]); i4++){
                    int vis[n] = {0};
                    for (int i=0; i<i2; i++)
                        vis[pos[2][i]] = true;
                    for (int i=0; i<i3; i++)
                        vis[pos[3][i]] = true;
                    for (int i=0; i<i4; i++)
                        vis[pos[4][i]] = true;
                    for (int i : pos[1])
                        vis[i] = true;

                    vector<int> vec;
                    A = aux;
                    for (int i=0; i<n; i++){
                        if (!vis[i]) continue;
                        A = a[i].t*(A - a[i].p);
                        if (A < 0) break;
                        if (A >= sum){
                            for (; i<n; i++)
                                if (vis[i])
                                    vec.push_back(a[i].id);
                            break;
                        }
                        vec.push_back(a[i].id);
                    }

                    if (vans.size() < vec.size())
                        vans = vec;
                }

        return vans;
    }

    for (int i=0; i<n; i++)
        vans.push_back(a[i].id);

    return vans;
}
#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...