stillnotred

Untitled

Jan 27th, 2025
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 1e6 + 10;
  5.  
  6. void solve(){
  7. ll n, k;
  8. cin >> n >> k;
  9. vector<ll> v(n);
  10. for(auto &x : v) cin >> x;
  11.  
  12. if(k == 1){
  13. ll ans = v.front();
  14. for(int i = 0;i + 1 < n;i += 1){
  15. ans = max(ans, v[i] + v[i + 1]);
  16. }
  17. cout << ans;
  18. return;
  19. }
  20.  
  21. // tot % k = 0;
  22. // v[i] pairs with v[i - 1] or v[i + 1] but not both
  23. // in a row
  24.  
  25. auto check = [&](ll col){
  26.  
  27. // col - number of people in a row
  28. ll prev = 0,done = 0;
  29.  
  30. for(int i = 0;i < n;i += 1){
  31. if(prev >= col){
  32. done += prev/col;
  33. }
  34. ll left = prev % col;
  35. if(left + v[i] < col){
  36. // think
  37. // nothing can be done if this path is choosen
  38. if(done >= k){
  39. return true;
  40. }
  41. prev = 0,done = 0; // take other options
  42. }
  43. else{
  44. prev = left + v[i] - col;
  45. ++done;
  46. }
  47. // cerr << done << ' ' << prev << " NEXT\n";
  48. }
  49. done += prev/col;
  50. // cerr << done << ' ';
  51.  
  52. return (done >= k);
  53. };
  54.  
  55. ll l = 1,r = 1e12;
  56. ll ans = 0;
  57. while(l <= r){
  58. ll mid = (l + r)/2ll;
  59.  
  60. if(check(mid)){
  61. ans = mid;
  62. l = mid + 1;
  63. }
  64. else r = mid - 1;
  65. }
  66.  
  67. // cerr << check(28);
  68. // cerr << '\n';
  69. // for(ll nk = 21;nk <= 28;nk += 1){
  70. // cout << check(nk) << ' ';
  71. // }
  72.  
  73. cout << (ans * 1ll * k);
  74.  
  75.  
  76. }
  77.  
  78. int main(){
  79. ios_base::sync_with_stdio(0);
  80. cin.tie(0);
  81. cout.tie(0);
  82.  
  83. int t = 1;
  84. cin >> t;
  85. while(t--){
  86. solve();
  87. cout << '\n';
  88. }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment