Submission #1251469

#TimeUsernameProblemLanguageResultExecution timeMemory
1251469windowwifeSouvenirs (IOI25_souvenirs)C++20
100 / 100
14 ms6696 KiB
#ifndef rtgsp
#include "souvenirs.h"
#endif // rtgsp

#include<bits/stdc++.h>
#define ll long long
#define task ""
using namespace std;
const int maxn = 2e5 + 2;
int n, q[maxn];
ll p[maxn], tot, cnt;
pair<vector<int>, ll> v, t[maxn];

#ifdef rtgsp
ll pp[maxn];
pair<vector<int>, ll> transaction (ll M)
{
    vector<int> s;
    s.clear();
    for (int i = 0; i < n; i++)
    {
        if (M >= pp[i])
        {
            M -= pp[i];
            s.push_back(i);
        }
    }
    return make_pair(s, M);
}
#endif // rtgsp

void buy_souvenirs(int N, ll P0)
{
    n = N;
    tot = P0; cnt = 1;
    for (int i = 1; i < n; i++) t[i] = {{}, 0};
    while (true)
    {
        assert(tot > 0);
        if (cnt == 1)
        {
            v = transaction(tot - 1);
            tot = tot - 1 - v.second;
            cnt = v.first.size();
            t[v.first[0]] = {v.first, tot};
            for (int i : v.first) q[i]++;
        }
        else
        {
            v = transaction(tot/cnt);
            tot = tot/cnt - v.second;
            cnt = v.first.size();
            t[v.first[0]] = {v.first, tot};
            for (int i : v.first) q[i]++;
        }
        if (v.first[0] == n - 1) break;
    }
    for (int i = n - 1; i > 0; i--)
    {
        if (t[i].second == 0)
        {
            for (int j = i - 1; j > 0; j--)
            {
                if (t[j].second == 0) continue;
                tot = t[j].second; cnt = t[j].first.size();
                for (int k : t[j].first)
                {
                    if (k > i)
                    {
                        tot -= p[k];
                        cnt--;
                    }
                }
                break;
            }
            while (true)
            {
                if (cnt == 1)
                {
                    v = transaction(tot - 1);
                    tot = tot - 1 - v.second;
                    cnt = v.first.size();
                    t[v.first[0]] = {v.first, tot};
                    for (int j : v.first) q[j]++;
                }
                else
                {
                    v = transaction(tot/cnt);
                    tot = tot/cnt - v.second;
                    cnt = v.first.size();
                    t[v.first[0]] = {v.first, tot};
                    for (int j : v.first) q[j]++;
                }
                for (int j : v.first)
                {
                    if (j > i)
                    {
                        tot -= p[j];
                        cnt--;
                    }
                }
                if (v.first[0] == i) break;
            }
        }
        for (int j : t[i].first)
            p[i] -= p[j];
        p[i] += t[i].second;
    }
    for (int i = 1; i < n; i++)
    {
        while (q[i] < i)
        {
            v = transaction(p[i]);
            assert(v.first.size() == 1);
            for (int j : v.first) q[j]++;
        }
    }
}

#ifdef rtgsp
int main()
{
    freopen(task".in", "r", stdin);
    //freopen(task".OUT", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    vector<ll> P;
    P.clear();
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        ll x;
        cin >> x;
        pp[i] = x;
        P.push_back(x);
    }
    buy_souvenirs(N, P[0]);
}
#endif // rtgsp
#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...