Submission #1261405

#TimeUsernameProblemLanguageResultExecution timeMemory
1261405alexdd축제 (IOI25_festival)C++20
100 / 100
96 ms72508 KiB
#include "festival.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
const int LIM = 40;
const long long INF = 1e17;
long long dp[MAXN][LIM + 1];
int n,init;
long long p[MAXN],t[MAXN];
bool cmp(int i, int j)
{
    if(t[i] == 1 && t[j] == 1)
        return p[i] < p[j];
    if(t[i] == 1)
        return 0;
    if(t[j] == 1)
        return 1;
    return p[i] * t[i] * (t[j] - 1) < p[j] * t[j] * (t[i] - 1);
}
std::vector<int> max_coupons(int copA, std::vector<int> P, std::vector<int> T)
{
    long long A = copA;
    n = P.size();
    for(int i=0;i<n;i++)
    {
        p[i] = P[i];
        t[i] = T[i];
    }
    init = A;
    vector<int> ord;
    for(int i=0;i<n;i++)
        ord.push_back(i);
    sort(ord.begin(),ord.end(),cmp);
    vector<int> sol,ramase,mici;
    for(int i:ord)
    {
        if((A - p[i]) * t[i] >= A)
        {
            sol.push_back(i);
            A = min(INF, (A - p[i]) * t[i]);
        }
        else
        {
            if(t[i] == 1) mici.push_back(i);
            else ramase.push_back(i);
        }
    }
    for(int cnt=0;cnt<=LIM;cnt++)
        dp[0][cnt] = -1;
    dp[0][0] = A;
    for(int i=0;i<ramase.size();i++)
    {
        int myt = t[ramase[i]], myp = p[ramase[i]];
        dp[i+1][0] = A;
        for(int cnt=1;cnt<=LIM;cnt++)
        {
            dp[i+1][cnt] = max(dp[i][cnt], (dp[i][cnt-1] - myp) * myt);
        }
    }
    long long mxm=-1,unde=-1,u1=-1;
    long long sum1=0,cnt1=0;

    for(int cnt=LIM;cnt>=0;cnt--)
    {
        if(dp[ramase.size()][cnt] < 0)
            continue;
        while(cnt1 < mici.size() && dp[ramase.size()][cnt] - sum1 - p[mici[cnt1]] >= 0)
        {
            sum1 += p[mici[cnt1]];
            cnt1++;
        }
        if(cnt + cnt1 > mxm)
        {
            mxm = cnt + cnt1;
            unde = cnt;
            u1 = cnt1;
        }
    }
    assert(mxm != -1);
    long long cur = unde;
    vector<int> aux;
    for(int i=(int)ramase.size()-1;i>=0;i--)
    {
        if(dp[i+1][cur] == dp[i][cur])
        {

        }
        else
        {
            aux.push_back(ramase[i]);
            cur--;
        }
    }
    assert(cur == 0);
    reverse(aux.begin(), aux.end());
    for(int x:aux) sol.push_back(x);
    for(int i=0;i<u1;i++)
        sol.push_back(mici[i]);
    return sol;
}
#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...