Submission #1303945

#TimeUsernameProblemLanguageResultExecution timeMemory
1303945prism7kSouvenirs (IOI25_souvenirs)C++20
7 / 100
12 ms400 KiB
#include "souvenirs.h" #include <bits/stdc++.h> using namespace std; void buy_souvenirs(int N, long long P0) { vector<vector<int>> transactions(N); vector<int> bought(N, 0); vector<long long> sent(N, 0); // phase 1: buy until last is reached long long M = P0 - 1; int at = 1; while(at + 1 < N) { auto res = transaction(M); vector<int> souv = res.first; long long rem = res.second; long long total_cost = M - rem; sort(souv.begin(), souv.end()); long long min_cost = 0; for(int i = 0; i < (int)souv.size(); ++i) { bought[souv[i]]++; min_cost += N - souv[i]; } transactions[at] = souv; sent[at] = total_cost; long long min_val_of_left = N - at; long long amt = N - at; total_cost -= min_cost; min_val_of_left += (total_cost + amt - 1) / amt; M = min_val_of_left - 1; at++; } // phase 2: find price of last auto res = transaction(M); vector<int> souv = res.first; long long rem = res.second; assert(souv.size() == 1); vector<long long> prices(N, 0); prices[N - 1] = M - rem; bought[N - 1]++; // phase 3: backtrack until all are bought for(int i = N - 1; i >= 1; --i) { if(prices[i] == 0) { for(int b : transactions[i]) { if(b != i) { sent[i] -= prices[b]; } } prices[i] = sent[i]; } while(bought[i] < i) { transaction(prices[i]); bought[i]++; } } prices[0] = P0; //~ cout << "PRICES\n"; //~ for(int i = 0; i < N; ++i) { //~ cout << prices[i] << " "; //~ } //~ cout << "\n-----------\n"; 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...