Advertisement
Guest User

Untitled

a guest
Feb 15th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. #pragma GCC optimize ("O3")
  2. #pragma GCC target ("sse4")
  3.  
  4. #include <bits/stdc++.h>
  5. #include <ext/pb_ds/tree_policy.hpp>
  6. #include <ext/pb_ds/assoc_container.hpp>
  7. #include <ext/rope>
  8.  
  9. using namespace std;
  10. using namespace __gnu_pbds;
  11. using namespace __gnu_cxx;
  12.  
  13. typedef long long ll;
  14. typedef long double ld;
  15. typedef complex<ld> cd;
  16.  
  17. typedef pair<int, int> pi;
  18. typedef pair<ll,ll> pl;
  19. typedef pair<ld,ld> pd;
  20.  
  21. typedef vector<int> vi;
  22. typedef vector<ld> vd;
  23. typedef vector<ll> vl;
  24. typedef vector<pi> vpi;
  25. typedef vector<pl> vpl;
  26. typedef vector<cd> vcd;
  27.  
  28. template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
  29.  
  30. #define FOR(i, a, b) for (int i = (a); i < (b); i++)
  31. #define F0R(i, a) for (int i = 0; i < (a); i++)
  32. #define FORd(i,a,b) for (int i = (b)-1; i >= (a); i--)
  33. #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
  34. #define trav(a, x) for (auto& a : x)
  35.  
  36. #define mp make_pair
  37. #define pb push_back
  38. #define f first
  39. #define s second
  40. #define lb lower_bound
  41. #define ub upper_bound
  42.  
  43. #define sz(x) (int)x.size()
  44. #define beg(x) x.begin()
  45. #define en(x) x.end()
  46. #define all(x) beg(x), en(x)
  47. #define resz resize
  48.  
  49. const int MOD = 1000000007;
  50. const ll INF = 1e18;
  51. const int MX = 100001;
  52. const ld PI = 4*atan((ld)1);
  53.  
  54. template<class T> void ckmin(T &a, T b) { a = min(a, b); }
  55. template<class T> void ckmax(T &a, T b) { a = max(a, b); }
  56.  
  57. int N, M, perm [10];
  58. ll arr [100010], groups [10], lo = 0, hi = INF/10000ll, ret;
  59.  
  60. bool checkLess(ll p, ll q, ll r){
  61. return p/q < r || (p/q == r && p%q == 0);
  62. }
  63.  
  64. bool checkIt(ll mini){
  65. for(int i = 0; i < M; i++) perm[i] = i;
  66. map<pair<int, int>, int> nexts;
  67. do{
  68. int idx = 0;
  69. for(int i = 0; i < M; i++){
  70. int curr = perm[i];
  71. if(nexts.find(mp(idx, curr)) == nexts.end()){
  72. int a = idx, b = N, best;
  73. while(a <= b){
  74. int mid = (a+b)/2;
  75. if(checkLess(arr[mid]-arr[idx], groups[curr], mini)){ a = mid+1; best = mid; }
  76. else b = mid-1;
  77. }
  78. nexts[mp(idx, curr)] = best;
  79. }
  80. idx = nexts[mp(idx, curr)];
  81. if(idx == N) break;
  82. }
  83. if(idx == N) return true;
  84. }while(next_permutation(perm, perm+M));
  85. return false;
  86. }
  87.  
  88. int main() {
  89. // you should actually read the stuff at the bottom
  90. ios_base::sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(10);
  91. cin >> N >> M;
  92. for(int i = 1; i <= N; i++){
  93. cin >> arr[i];
  94. arr[i] += arr[i-1];
  95. }
  96. for(int i = 0; i < M; i++) cin >> groups[i];
  97. while(lo <= hi){
  98. ll mid = (lo+hi)/2;
  99. if(checkIt(mid)){ hi = mid-1; ret = mid; }
  100. else lo = mid+1;
  101. }
  102. cout << ret << '\n';
  103. //cout << "HI" << endl;
  104. // you should actually read the stuff at the bottom
  105. }
  106.  
  107. /* stuff you should look for
  108. * int overflow, array bounds
  109. * special cases (n=1?), set tle
  110. * do smth instead of nothing and stay organized
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement