제출 #1252485

#제출 시각아이디문제언어결과실행 시간메모리
1252485Jakub_Wozniak축제 (IOI25_festival)C++20
24 / 100
60 ms10164 KiB
#include "festival.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200009;
#define st first
#define nd second
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
vector <pll> t[5];
vector<ll> pref;
vector <ll> HA;

int bs(int A)
{
  int l = 0 , r = pref.size() , sro;
  while(r - l > 1)
  {
    sro = (l+r)/2;
    if(pref[sro] <= A)l=sro;
    else r = sro;
  }
  return l;
}

std::vector<int> max_coupons(int A, std::vector<int> P, std::vector<int> T) 
{
  ll rA = A;
  int N = P.size();
  for(int i = 0; i < N ; i++)
  {
    t[T[i]].push_back({P[i],i});
  }
  for(int j = 1 ; j <= 4 ; j++)sort(t[j].begin() , t[j].end());
  pref.push_back(0);
  for(auto p : t[1])pref.push_back(pref[pref.size()-1] + p.st);

  vector <int> K;
  HA.push_back(rA);
  int ile = bs(rA) , ind = 0;
  
  for(int i = 1;  i <= t[2].size() ; i++)
  {
    if(rA < t[2][i-1].st)break;
    int akt = i;
    rA -= t[2][i-1].st;
    rA *= 2;
    HA.push_back(rA);
    akt += bs(rA);


    if(rA >= (1e+17))
    {
      vector <int> temp;
      for(auto p : t[2])temp.push_back(p.nd);
      for(auto p : t[1])temp.push_back(p.nd);
      return temp;
    }

    if(akt > ile)
    {
      ile = akt;
      ind = i;
    }
  }

  for(int i = 0 ; i < ind;  i++)K.push_back(t[2][i].nd);
  int I = bs(HA[ind]);
  for(int i = 0 ; i < I ; i++)K.push_back(t[1][i].nd);

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