FHVirus

Untitled

May 5th, 2021 (edited)
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. // Knapsack DP is harder than FFT.
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef int64_t ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll;
  5. #define ff first
  6. #define ss second
  7. #define pb emplace_back
  8. #define FOR(i,n) for(int i=0;i<(n);++i)
  9. #define FOO(i,a,b) for(int i=(a);i<=int(b);++i)
  10. #define OOF(i,a,b) for(int i=(a);i>=int(b);--i)
  11. #define AI(x) begin(x),end(x)
  12. template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;}
  13. template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;}
  14. inline ll cdiv(ll x,ll m){return x/m+(x%m?(x<0)^(m>0):0);}
  15. #ifdef OWO
  16. #define safe cerr<<"\033[1;32m"<<__PRETTY_FUNCTION__<<" - "<<__LINE__<<" JIZZ\033[0m\n"
  17. #define debug(args...) SDF(#args, args)
  18. #define OIU(args...) ostream& operator<<(ostream&O,args)
  19. #define LKJ(S,B,E,F) template<class...T>OIU(S<T...>s){O<<B;int c=0;for(auto i:s)O<<(c++?", ":"")<<F;return O<<E;}
  20. LKJ(vector,'[',']',i)LKJ(deque,'[',']',i)LKJ(set,'{','}',i)LKJ(multiset,'{','}',i)LKJ(unordered_set,'{','}',i)LKJ(map,'{','}',i.ff<<':'<<i.ss)LKJ(unordered_map,'{','}',i.ff<<':'<<i.ss)
  21. template<class T,size_t N>OIU(array<T,N>a){return O<<vector<T>(AI(a));}template<class...T>OIU(pair<T...>p){return O<<'('<<p.ff<<','<<p.ss<<')';}template<class...T>OIU(tuple<T...>t){return O<<'(',apply([&O](T...s){int c=0;(...,(O<<(c++?", ":"")<<s));},t),O<<')';}
  22. template<class...T>void SDF(const char* s,T...a){int c=sizeof...(T);if(!c){cerr<<"\033[1;32mvoid\033[0m\n";return;}(cerr<<"\033[1;32m("<<s<<") = (",...,(cerr<<a<<(--c?", ":")\033[0m\n")));}
  23. #else
  24. #pragma GCC optimize("Ofast")
  25. #define safe ((void)0)
  26. #define debug(...) ((void)0)
  27. #endif
  28. const ll inf = 1e9, INF = 4e18;
  29.  
  30. vector<int> f, d, t;
  31.  
  32. ll check(int p, int lim){
  33.     ll tot = 0;
  34.     for(int i = 1; i <= p; ++i){
  35.         if(d[i] == 0){
  36.             if(f[i] >= lim) return INF;
  37.             continue;
  38.         }
  39.         tot += cdiv(f[i] - lim + 1, d[i]);
  40.     }
  41.     return tot;
  42. }
  43.  
  44. ll calc(int T, int p){
  45.     int l = 0, r = 1e5 + 1, m;
  46.     ll ret;
  47.     while(l < r){
  48.         // choose every value >= l
  49.         m = (l + r) / 2;
  50.         ret = check(p, m);
  51.         if(ret > T) l = m + 1;
  52.         else r = m;
  53.     }
  54.  
  55.     ll ans = 0;
  56.     for(int i = 1; i <= p; ++i){
  57.         if(f[i] < l) continue;
  58.         ll x = cdiv(f[i] - l + 1, d[i]);
  59.         ans += (f[i] + (f[i] - d[i] * (x-1))) * x / 2;
  60.         T -= x;
  61.     }
  62.  
  63.     if(l - 1 > 0) ans += (l-1) * T;
  64.  
  65.     return ans;
  66. }
  67.  
  68. void solve(int T, int n){
  69.     f.assign(n + 1, 0);
  70.     d.assign(n + 1, 0);
  71.     t.assign(n + 1, 0);
  72.     for(int i = 1; i <= n; ++i) cin >> f[i];
  73.     for(int i = 1; i <= n; ++i) cin >> d[i];
  74.     for(int i = 1; i <= n; ++i) cin >> t[i];
  75.  
  76.     ll ans = 0;
  77.     for(int i = 1; i <= n; ++i){
  78.         T -= t[i];
  79.         if(T <= 0) break;
  80.         chmax(ans, calc(T, i));
  81.     }
  82.     cout << ans << '\n';
  83. }
  84.  
  85. int32_t main(){
  86.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  87.     int T, n;
  88.     while(cin >> T >> n) solve(T, n);
  89.     return 0;
  90. }
  91.  
Add Comment
Please, Sign In to add comment