Advertisement
7oSkaaa

J

Feb 25th, 2023
531
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.08 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define fixed(n) fixed << setprecision(n)
  6. #define ceil(n, m) (((n) + (m) - 1) / (m))
  7. #define add_mod(a, b, m) (((a % m) + (b % m)) % m)
  8. #define sub_mod(a, b, m) (((a % m) - (b % m) + m) % m)
  9. #define mul_mod(a, b, m) (((a % m) * (b % m)) % m)
  10. #define all(vec) vec.begin(), vec.end()
  11. #define rall(vec) vec.rbegin(), vec.rend()
  12. #define sz(x) int(x.size())
  13. #define debug(x) cout << #x << ": " << (x) << "\n";
  14. #define fi first
  15. #define se second
  16. #define ll long long
  17. #define ull unsigned long long
  18. #define EPS 1e-9
  19. constexpr int INF = 1 << 30, Mod = 1e9 + 7;
  20. constexpr ll LINF = 1LL << 62;
  21. #define PI acos(-1)
  22. template < typename T = int > using Pair = pair < T, T >;
  23. vector < string > RET = {"NO", "YES"};
  24.  
  25. template < typename T = int > istream& operator >> (istream &in, vector < T > &v) {
  26.     for (auto &x : v) in >> x;
  27.     return in;
  28. }
  29.  
  30. template < typename T = int > ostream& operator << (ostream &out, const vector < T > &v) {
  31.     for (const T &x : v) out << x << ' ';
  32.     return out;
  33. }
  34.  
  35. template < typename T = int > struct Stack {
  36.    
  37.     vector < T > st, Monotonic;
  38.     T DEFAULT = INF;
  39.  
  40.     Stack() {
  41.         Monotonic = {DEFAULT}, st = {};
  42.     }
  43.  
  44.     T operation(T a, T b){
  45.         return min(a, b);
  46.     }
  47.  
  48.     void push(T x){
  49.         st.emplace_back(x);
  50.         Monotonic.push_back(operation(Monotonic.back(), x));
  51.     }
  52.  
  53.     T pop(){
  54.         T res = st.back();
  55.         st.pop_back();
  56.         Monotonic.pop_back();
  57.         return res;
  58.     }
  59.    
  60.     bool empty(){
  61.         return st.empty();
  62.     }
  63.    
  64.     T Monotonic_val(){
  65.         return Monotonic.back();
  66.     }
  67.  
  68.     int size(){
  69.         return st.size();
  70.     }
  71.  
  72. };
  73.  
  74. template < typename T = int > struct Monotonic_Queue {
  75.  
  76.     Stack < T > s1, s2;
  77.  
  78.     Monotonic_Queue () {
  79.         s1 = Stack < T > (), s2 = Stack < T > ();
  80.     }
  81.  
  82.     T operation(T a, T b){
  83.         return min(a, b);
  84.     }
  85.  
  86.     void push(T x){
  87.         s2.push(x);
  88.     }
  89.  
  90.     void pop(){
  91.         if(s1.empty()){
  92.             while(!s2.empty())
  93.                 s1.push(s2.pop());
  94.         }
  95.         s1.pop();
  96.     }
  97.  
  98.     bool is_good(){
  99.         return operation(s1.Monotonic_val(), s2.Monotonic_val()) == 1;
  100.     }
  101.  
  102.     T Monotonic_val(){
  103.         return operation(s1.Monotonic_val(), s2.Monotonic_val());
  104.     }
  105.  
  106.     int size(){
  107.         return s1.size() + s2.size();
  108.     }
  109. };
  110.  
  111.  
  112. int n, k, mm;
  113. vector < int > keys, c, primes;
  114.  
  115. constexpr int MaxN = 31625;
  116. bool is_prime[MaxN];
  117.  
  118. void sieve(){
  119.     memset(is_prime, true, sizeof is_prime);
  120.     is_prime[0] = is_prime[1] = false;
  121.     for(ll i = 2; i < MaxN; i++)
  122.         if(is_prime[i]){
  123.             primes.push_back(i);
  124.             for(ll j = i * i; j < MaxN; j += i)
  125.                 is_prime[j] = false;
  126.         }
  127. }
  128.  
  129. int prime_factor(int x){    
  130.     for(auto& p : primes)
  131.         if(x % p == 0)
  132.             return p;
  133.     return x;
  134. }
  135.  
  136. bool is_good(int m){
  137.     vector < ll > dp(n + 5, INF);
  138.     dp[0] = 0;
  139.     Monotonic_Queue < ll > q;
  140.     q.push(0);
  141.     for(int i = 1; i <= k && i <= n + 1; i++){
  142.         if(keys[i] <= m)
  143.             dp[i] = c[i];
  144.         q.push(dp[i]);
  145.     }
  146.     q.pop();
  147.     for(int i = k + 1; i <= n + 1; i++){
  148.         if(keys[i] <= m)
  149.             dp[i] = q.Monotonic_val() + c[i];
  150.         q.push(dp[i]);
  151.         q.pop();
  152.     }
  153.     return dp[n + 1] <= mm;
  154. }
  155.  
  156. void Solve(){
  157.     sieve();
  158.     cin >> n >> k >> mm;
  159.     if(k > n)
  160.         return cout << 0 << '\n', void();
  161.     keys = c = vector < int > (n + 5);
  162.     for(int i = 1; i <= n; i++) cin >> keys[i], keys[i] = prime_factor(keys[i]);
  163.     for(int i = 1; i <= n; i++) cin >> c[i];
  164.     int l = 2, r = 1e9, ans = -1;
  165.     while(l <= r){
  166.         int m = l + (r - l) / 2;
  167.         (is_good(m) ? ans = m, r = m - 1 : l = m + 1);
  168.     }
  169.     cout << ans << '\n';
  170. }
  171.  
  172. int main(){
  173.     ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  174.     int test_cases = 1;
  175.     // cin >> test_cases;
  176.     for(int tc = 1; tc <= test_cases; tc++){
  177.         // cout << "Case #" << tc << ": ";
  178.         Solve();
  179.     }
  180.     return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement