Submission #1262512

#TimeUsernameProblemLanguageResultExecution timeMemory
1262512abdelhakimSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms420 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
#define ll long long
#define dbg(x) cerr<<#x << ' ' << x << endl;
using namespace std;
ll n;
vector<ll> value;
vector<ll> cnt;
void printvec(vector<ll>& v)
{
  for (auto &&e : v)
  {
    cout << e << ' ' ;
  }
  cout << endl; 
}
void gad(vector<int>& v)
{
  for (auto &&e : v)
  {
    cnt[e]++;
  }
}
void buy_souvenirs(int N, long long P0) {
  // std::pair<std::vector<int>, long long> res = transaction(3);
  n=N;
  value.resize(n);
  cnt.resize(n);
  value[0]=P0;
  map<ll,pair<ll,vector<int>>> mp;
  pair<vector<int>,ll> res1 = transaction(P0-1);
  gad(res1.first);
  mp[1]={P0-1-res1.second,res1.first};
  if(res1.first.size()==1)
  {
    value[1]=P0-1-res1.second;
  }
  for (int i=n-1;i>=1;i--)
  {
    if(value[i]==0)
    {
      ll val=0;
      for (int j=i;j>=0;j--)
      {
        if(mp[j].first!=0)
        {
          vector<ll> v;
          ll sm=mp[j].first;
          for (auto &&e : mp[j].second)
          {
            if(e>i)sm-=value[e];
            else
            {
              v.push_back(e);
            }
          }
          val=sm/v.size();
          if(v.size()==1)
          {
            val=sm-1;
            value[v[0]]=sm;
          }
          break;
        }
      }
    
      while(value[i]==0)
      {
        pair<vector<int>,ll> res = transaction(val);
        vector<int> v;
        ll sm=val-res.second;
        for (auto &&e : res.first)
        {
          if(e>i)sm-=value[e];
          else
          {
            v.push_back(e);
          }
        }
        mp[v[0]]={sm,v};
        if(v.size()==1)
        {
          value[v[0]]=sm;
        }
        gad(res.first);
        val=sm/v.size();
        if(v.size()==1)
        {
          val=sm-1;
        }
      }
    }
  }
  for (int i=1;i<n;i++)
  {
    while(cnt[i]<i)
    {
      pair<vector<int>,ll> res = transaction(value[i]);
      cnt[i]++;
    }
  }
  return;
}
#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...