제출 #1269570

#제출 시각아이디문제언어결과실행 시간메모리
1269570SamAnd축제 (IOI25_festival)C++20
0 / 100
1008 ms2162688 KiB
#include "festival.h"
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define fi first
#define se second
typedef long long ll;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
mt19937 rnf(2106);
const int N = 200005;
const ll INF = 200005000000009;

struct ban
{
    int i;
    ll p, t;
};
ll F(ll A, const ban& u)
{
    return (A - u.p) * u.t;
}
bool operator<(const ban& a, const ban& b)
{
    return F(F(0, a), b) < F(F(0, b), a);
}

std::vector<int> max_coupons(int aa, std::vector<int> P, std::vector<int> T)
{
    int n;
    n = sz(P);

    vector<pair<ll, ban> > v;
    for (int i = 0; i < n; ++i)
    {
        ban u;
        u.p = P[i];
        u.t = T[i];
        u.i = i;
        if (u.t == 1)
            v.push_back(m_p(INF, u));
        else
        {
            ll x = u.p * u.t;
            if (x % (u.t - 1) == 0)
                x /= (u.t - 1);
            else
            {
                x /= (u.t - 1);
                ++x;
            }
            v.push_back(m_p(x, u));
        }
    }
    sort(all(v));
    reverse(all(v));

    priority_queue<ban> q;
    ll A = aa;
    vector<int> ans;
    while (1)
    {
        while (!v.empty() && A >= v.back().fi)
        {
            q.push(v.back().se);
            v.pop_back();
        }
        if (q.empty())
            break;
        ban u = q.top();
        q.pop();
        A = min(INF, (A - u.p) * u.t);
        ans.push_back(u.i);
    }

    for (int i = 0; i < sz(v); ++i)
        v[i].fi = 0;
    sort(all(v));
    reverse(all(v));

    vector<vector<ll> > dp(sz(v) + 1, vector<ll>(sz(v), -1));
    dp[0][0] = A;
    for (int i = 0; i < sz(v); ++i)
    {
        ban u = v[i].se;
        for (int q = 0; q <= i; ++q)
        {
            dp[i + 1][q] = max(dp[i + 1][q], dp[i][q]);
            if (dp[i][q] >= u.p)
                dp[i + 1][q + 1] = max(dp[i + 1][q + 1], (dp[i][q] - u.p) * u.t);
        }
    }

    vector<int> yans;
    for (int q = sz(v); q >= 0; --q)
    {
        if (dp[sz(v)][q] >= 0)
        {
            for (int i = sz(v) - 1; i >= 0; --i)
            {
                if (dp[i + 1][q] == dp[i][q])
                    continue;
                yans.push_back(v[i].se.i);
                --q;
            }
        }
    }
    reverse(all(yans));
    for (int i = 0; i < sz(yans); ++i)
        ans.push_back(yans[i]);
    return ans;
}

/*
4 13
4 1
500 3
8 3
14 4

2 1000
999 4
3 1
*/
#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...