제출 #138429

#제출 시각아이디문제언어결과실행 시간메모리
138429silxikysBrunhilda’s Birthday (BOI13_brunhilda)C++14
21.43 / 100
105 ms44572 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int maxn = 1e5+5, INF = 2e9+9; int m, Q; int dp[10000005]; vector<int> primes; struct Bag { multiset<int> ms; int aux = 0; int max() { return *ms.rbegin() + aux; } void delta(int x) { aux += x; } void insert(int x) { ms.insert(x-aux); } void remove(int x) { auto it = ms.find(x-aux); ms.erase(it); } }; struct Bag2 { set<pair<int,int>> ms; int aux = 0; void delta(int x) { aux += x; } pair<int,int> min() { return {ms.begin()->first+aux,ms.begin()->second}; } void pop() { ms.erase(ms.begin()); } void insert(pair<int,int> p) { ms.insert({p.first-aux,p.second}); } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> m >> Q; for (int i = 0; i < m; i++) { int p; cin >> p; primes.push_back(p); } sort(primes.begin(),primes.end()); int maxPrime = primes.back(); for (int i = 1; i < maxPrime; i++) { dp[i] = 1; } Bag bag; Bag2 mods; for (int p: primes) { bag.insert((maxPrime-1)%p); mods.insert({p-((maxPrime-1)%p),p}); } for (int i = maxPrime; i <= 10000; i++) { bag.delta(1); mods.delta(-1); while (mods.min().first == 0) { int p = mods.min().second; mods.pop(); mods.insert({p,p}); bag.remove(p); bag.insert(0); } dp[i] = INF; int mxmod = bag.max(); dp[i] = min(dp[i],1+dp[i-mxmod]); /* cout << i << " : " << mxmod << ' '; int mx = 0; for (int p: primes) { mx = max(mx,i%p); } cout << mx << '\n'; */ } /* for (int i = 1; i <= 50; i++) { cout << i << ": " << dp[i] << '\n'; } */ while (Q--) { int qi; cin >> qi; if (dp[qi] == INF) cout << "oo\n"; else cout << dp[qi] << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...