1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <bits/stdc++.h> using namespace std;
typedef long long ll; typedef complex<double> cp; const int N = 6e5 + 5; const double pi = acos(-1.0); int n, m, len = 1, l, rev[N], x[N], y[N]; cp a[N * 2], b[N];
void fft(cp *a, int n, int inv) { for (int i = 0; i < n; i++) if (rev[i] < i) swap(a[i], a[rev[i]]); for (int k = 1; k < n; k <<= 1) { cp wn(cos(pi / k), inv * sin(pi / k)); for (int i = 0; i < n; i += k * 2) { cp w(1, 0); for (int j = 0; j < k; j++, w *= wn) { cp x = a[i + j], y = a[i + j + k] * w; a[i + j] = x + y, a[i + j + k] = x - y; } } } if (inv < 0) for (int i = 0; i < len; i++) a[i] /= n; }
int main() { ll res = 0, dis = 0, mx = -998244353, ans = 998244353; scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &x[i]), res = res + x[i] * 1ll * x[i]; for (int i = 1; i <= n; i++) scanf("%d", &y[i]), res = res + y[i] * 1ll * y[i], dis += x[i] - y[i]; while (len <= n * 2) len <<= 1, l++; for (int i = 0; i < len; i++) rev[i] = (rev[i >> 1] >> 1) | ((1 & i) << (l - 1)); for (int i = 1; i <= n; i++) a[i].real((double)(x[n - i + 1])), b[i].real((double)(y[i])); for (int i = 1; i <= n; i++) a[i + n].real(a[i].real()); fft(a, len, 1), fft(b, len, 1); for (int i = 0; i < len; i++) a[i] *= b[i]; fft(a, len, -1); for (int i = n + 1; i <= 2 * n; i++) mx = max(mx, (ll)(a[i].real() + 0.5)); mx *= -2; for (int c = -m; c <= m; c++) ans = min(ans, n * 1ll * c * c + 2 * c * 1ll * dis); printf("%lld\n", res + mx + ans); return 0; }
|