Submission #1249903

#TimeUsernameProblemLanguageResultExecution timeMemory
1249903Jakub_WozniakSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms420 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<vector <int> ,ll> pvl;
#define st first
#define nd second
const int maxn = 109;
ll P[maxn];
int ile[maxn];
int ng;

pvl zap(ll L)
{
  pvl temp = transaction(L);
  for(auto p : temp.st)
  {
    ile[p]++;
  }
  return temp;
}

void rek(vector <int> v , ll sum)
{
  if(v.size() == 1)
  {
    P[v[0]] = sum;
    if(v[0] == ng-1)return ;
    if(P[v[0]+1] == 0)
    {
      pvl temp = zap(P[v[0]]-1);
      rek(temp.st , P[v[0]]-1-temp.nd);
    }
    return ;
  }
    //cerr << "NEW: ";
    //for(auto p : v )cerr << p << ' ' ; cerr << '\n';
    //for(auto p : v )cerr << P[p] << ' ' ; cerr << '\n';
    //cerr << "  " << sum << endl;
    //cerr <<"END\n";
    vector <int> nv;
    bool czyz = 0;
    for(auto p : v)
    {
      if(P[p] != 0)
      {
        sum -= P[p];
        czyz = 1;
      }
      else
      {
        nv.push_back(p);
      }
    }

    if(czyz)
    {
      rek(nv,sum);
      return ;
    }

    if(v.size() == 0)return ;
    if(v.size() == 1)
    {
      P[v[0]] = sum;
      return ;
    }
    

    ll sr = sum/(v.size());
    pvl temp = zap(sr);
    rek(temp.st , sr-temp.nd);
    rek(v,sum);
}


void buy_souvenirs(int N, long long P0) 
{
  ng = N;
  P[0] = P0;
  for(int i = 1; i < N ; i++)
  {
    if(P[i] != 0)continue;
    pvl temp = zap(P[i-1]-1);
    rek(temp.st , P[i-1]-1-temp.nd); 
  }

  for(int i = 1; i < N ; i++)
  {
    while(ile[i] < i)
    {
      zap(P[i]);
    }
  }
  
  return;
}


/*
9
100 59 58 57 9 8 7 6 5
*/
#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...