Submission #1250116

#TimeUsernameProblemLanguageResultExecution timeMemory
1250116Zbyszek99Souvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms424 KiB
#include "souvenirs.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} ll los(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+9; int cnt[101]; ll cost[101]; pair<vi,ll> ask(ll k) { pair<vi,ll> a = transaction(k); forall(it,a.ff) cnt[it]++; return {a.ff,k-a.ss}; } void solve(ll k, pair<vi,ll> ans, int l, int r) { if(l > r) return; if(l == r) { cost[l] = ans.ss; forall(it,ans.ff) { if(it != l) cost[l] -= cost[it]; } return; } if(siz(ans.ff) == 1) { cost[l] = ans.ss; solve(cost[l]-1,ask(cost[l]-1),l+1,r); return; } ll avr = ans.ss; ll cnt2 = siz(ans.ff); forall(it,ans.ff) { if(it > r) { avr -= cost[it]; cnt2--; } } avr = avr/cnt2; if(cnt2 > 1) { pair<vi,ll> avr_ans = ask(avr); int l2 = avr_ans.ff[0]; if(siz(ans.ff) > 1) solve(avr,avr_ans,l2,r); solve(k,ans,l,l2-1); } else { cost[ans.ff[0]] = avr; if(ans.ff[0] != r) solve(avr-1,ask(avr-1),ans.ff[0]+1,r); solve(k,ans,l,ans.ff[0]-1); } } void buy_souvenirs(int n, ll P0) { pair<vi,ll> avr_ans = ask(P0-1); solve(P0-1,avr_ans,1,n-1); for(int i = n-1; i >= 0; i--) { int add = (i-cnt[i]); rep(j,add) { transaction(cost[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...