[BZOJ4827][HNOI2017]礼物(FFT)
来源:互联网 发布:淘宝下载手机版 编辑:程序博客网 时间:2024/06/05 14:31
可以想到,先旋转到最优方案,再枚举亮度。
而关键在于怎样求旋转到的最优方案。
把差异值的式子展开得到:
所以目标就是让
此时可以发现,如果旋转第一个环之后第一个环的第
如果分别把第一个环和第二个环翻转,并把环看作多项式,那么可以发现
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <bits/stdc++.h> using namespace std;inline int read() { int res = 0; bool bo = 0; char c; while (((c = getchar()) < '0' || c > '9') && c != '-'); if (c == '-') bo = 1; else res = c - 48; while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + (c - 48); return bo ? ~res + 1 : res;}typedef complex<double> cyx;const int N = 2e5 + 5, INF = 0x3f3f3f3f; const double pi = acos(-1.0);int n, m, a[N], b[N], rev[N], lef[N], rig[N], ff, tmp[N];cyx A[N], B[N];void FFT(int n, cyx *y, int op) { int i, j, k; for (i = 0; i < n; i++) if (i < rev[i]) swap(y[i], y[rev[i]]); for (k = 1; k < n; k <<= 1) { cyx x(cos(pi / k), op * sin(pi / k)); for (i = 0; i < n; i += (k << 1)) { cyx w(1, 0); for (j = 0; j < k; j++) { cyx u = y[i + j], v = w * y[i + j + k]; y[i + j] = u + v; y[i + j + k] = u - v; w = w * x; } } }}void solve() { int i, tot = 0; ff = 1; while (ff <= (n << 1) - 2) ff <<= 1, tot++; memset(rev, 0, sizeof(rev)); for (i = 0; i <= ff; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << tot - 1); FFT(ff, A, 1); FFT(ff, B, 1); for (i = 0; i <= ff; i++) A[i] = A[i] * B[i]; FFT(ff, A, -1);}int main() { int i, sum = 0, pos = 0, now = INF, ans = INF, sm = 0; n = read(); m = read(); for (i = 1; i <= n; i++) a[i] = read(), sum += a[i] * a[i]; for (i = 1; i <= n; i++) b[i] = read(), sum += b[i] * b[i]; for (i = 0; i < n; i++) A[i] = a[n - i], B[i] = b[i + 1]; solve(); for (i = 1; i <= n; i++) rig[i] = ((int) (A[n - i].real() / ff + 0.5)); for (i = 0; i <= ff; i++) A[i] = B[i] = 0; for (i = 0; i < n; i++) A[i] = a[i + 1], B[i] = b[n - i]; solve(); for (i = 1; i <= n; i++) lef[i] = ((int) (A[i - 1].real() / ff + 0.5)); for (i = 1; i <= n; i++) { int x = sum - (lef[i - 1] + rig[i] << 1); if (x < now) now = x, pos = i; } if (pos > 1) { for (i = pos; i <= n; i++) tmp[i] = a[i]; for (i = n; i >= n - pos + 2; i--) a[i] = a[i - n + pos - 1]; for (i = pos; i <= n; i++) a[i - pos + 1] = tmp[i]; } for (i = 1; i <= n; i++) sm += a[i] - b[i]; for (i = -100; i <= 100; i++) ans = min(ans, now + n * i * i + 2 * sm * i); printf("%d\n", ans); return 0;}
阅读全文
0 0
- BZOJ4827: [Hnoi2017]礼物(FFT)
- [BZOJ4827][HNOI2017]礼物(FFT)
- BZOJ4827:[Hnoi2017]礼物 (FFT)
- [BZOJ4827][Hnoi2017]礼物-FFT
- BZOJ4827 [Hnoi2017]礼物
- bzoj4827: [Hnoi2017]礼物
- BZOJ4827: [Hnoi2017]礼物
- BZOJ4827: [Hnoi2017]礼物
- bzoj4827: [Hnoi2017]礼物
- bzoj 4827: [Hnoi2017]礼物 (FFT)
- bzoj 4827 [Hnoi2017]礼物(FFT)
- bzoj 4827: [Hnoi2017]礼物 fft
- [FFT] BZOJ 4827 [Hnoi2017]礼物
- BZOJ 4827: [Hnoi2017]礼物(FFT)
- BZOJ 4827: [Hnoi2017]礼物 FFT
- HNOI2017 礼物
- [HNOI2017]礼物gift
- 4827: [Hnoi2017]礼物
- 【转】Rancher 2.0:K8s之上的Rancher魔法
- Java EE开发第十二章:2.Servlet之Request请求(请求行、头、体、转发,转发和重定向区别,中文乱码)
- “低配版”小米MIX 2发布 网友:雷军看了想打人
- 十一送iPhoneX、大疆无人机!还能免费修手机!够给力吧!
- html大吐槽 1结构解析
- [BZOJ4827][HNOI2017]礼物(FFT)
- Halcon 学习笔记 (一)
- [BZOJ]1221: [HNOI2001] 软件开发 费用流
- PAT 甲级 1066. Root of AVL Tree (25)
- 学习笔记之genericity
- 搭建环境(四)Ubuntu14.04 安装TensorFlow1.3.0
- 基于ssm框架的个人博客系统(11)--后台开发及前后端数据交互
- Strategy 策略模式 --对象行为型模式
- c++知识点---函数模板实现求数组的最大值