제출 #1258880

#제출 시각아이디문제언어결과실행 시간메모리
1258880AvianshSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms424 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <bits/stdc++.h>

using namespace std;

void buy_souvenirs(int n, long long P0) {
    long long val[n];
    fill(val,val+n,-1);
    val[0]=P0;
    set<int>dep[n];
    long long sum[n];
    int cnt[n];
    fill(cnt,cnt+n,0);
    while(1){
        int temp = 0;
        for(int i = 0;i<n;i++){
            if(val[i]==-1){
                temp++;
            }
        }
        if(temp==0){
            break;
        }
        bool req = 0;
        for(int i = n-1;i>=0;i--){
            if(val[i]==-1&&dep[i].size()==0){
                req=1;
            }
            if(val[i]!=-1&&req){
                req=0;
                pair<vector<int>,long long>p = transaction(val[i]-1);
                for(int i : p.first){
                    cnt[i]++;
                }
                long long sm = val[i]-1-p.second;
                set<int>s;
                for(int i : p.first){
                    s.insert(i);
                }
                for(int i : p.first){
                    if(val[i]!=-1){
                        sm-=val[i];
                        s.erase(i);
                    }
                }
                dep[i+1]=s;
                sum[i+1]=sm;
                break;
            }
            if(dep[i].size()==1){
                dep[i].clear();
                val[i]=sum[i];
                break;
            }
            if(dep[i].size()){
                set<int>er;
                for(int x : dep[i]){
                    if(val[x]!=-1){
                        sum[i]-=val[x];
                        er.insert(x);
                    }
                }
                for(int x : er){
                    dep[i].erase(x);
                }
                if(dep[i].size()==1){
                    dep[i].clear();
                    val[i]=sum[i];
                    break;
                }
                pair<vector<int>,long long>p = transaction(sum[i]/dep[i].size());
                for(int i : p.first){
                    cnt[i]++;
                }
                long long sm = sum[i]/dep[i].size()-p.second;
                set<int>s;
                for(int i : p.first){
                    s.insert(i);
                }
                for(int i : p.first){
                    if(val[i]!=-1){
                        sm-=val[i];
                        s.erase(i);
                    }
                }
                dep[*s.begin()]=s;
                sum[*s.begin()]=sm;
                break;
            }
        }
    }
    for(int i = 0;i<n;i++){
        while(cnt[i]<i){
            transaction(val[i]);
            cnt[i]++;
        }
    }
}
#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...