Facebook
From X, 3 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 507
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7.  
  8.  
  9. #define ll  long long
  10. #define vc  vector
  11. #define loop(xxx, yyy) for(int xxx = 0; xxx < yyy; xxx++)
  12.  
  13. using namespace std;
  14.  
  15.  
  16. using namespace std;
  17.  
  18. ll w,n;
  19. vc<ll> v;
  20.  
  21. ll dist(ll a, ll b){
  22.     if(a > b) swap(a,b);
  23.  
  24.     // a <= b
  25.     ll d = b-a;
  26.     return min(d,n-d);
  27. }
  28.  
  29. ll f(ll target){
  30.     ll sum = 0;
  31.     for(ll e : v){
  32.         sum += dist(e,target);
  33.     }
  34.     return sum;
  35. }
  36.  
  37. void test(int testIndex){
  38.     cin >> w >> n;
  39.     v = vc<ll>(w);
  40.  
  41.     loop(i,w){
  42.         cin >> v[i];
  43.  
  44.         v[i]%=n;
  45.     }
  46.     ll ans = 0;
  47.     loop(XXX,20) {
  48.         ll rnd = abs(1ll * rand()*rand());
  49.  
  50.         ans += rnd;
  51.         ans %= n;
  52.         loop(i,w){
  53.             v[i]+=rnd;
  54.             v[i] %= n;
  55.         }
  56.  
  57.  
  58.         ll l = 0, r = n - 1;
  59.  
  60.         while (l + 5 < r) {
  61.             ll A1 = l + (r - l) / 3;
  62.             ll A2 = r - (r - l) / 3;
  63.  
  64.             if (f(A1) < f(A2)) {
  65.                 r = A2;
  66.             } else {
  67.                 l = A1;
  68.             }
  69.         }
  70.  
  71.         for (ll i = l; i <= r; i++) {
  72.             if (f(ans) > f(i)) {
  73.                 ans = i;
  74.             }
  75.         }
  76.     }
  77.  
  78.     printf("Case #%d: %lld\n", testIndex, f(ans));
  79. }
  80.  
  81. int main() {
  82.     int t;
  83.     cin >> t;
  84.     loop(I,t)  test(I+1);
  85.     return 0;
  86. }
  87.  
  88.  
  89.  
  90.  
  91.