P3723 [AH2017/HNOI2017]礼物(FFT)

P3723 [AH2017/HNOI2017]礼物

式子化简

∑i=1n(xi−yj)2\sum_{i = 1} ^{n} (x_i- y_j) ^2\\ i=1n(xiyj)2

我们对第一个手环+c+c+c,相当于(xi+c−yi)2(x_i + c - y_i) ^ 2(xi+cyi)2,对第二个手环+c+c+c相当于(xi−yi−c)2(x_i - y_i - c) ^2(xiyic)2

也就是(xi−yj+c)2(x_i - y_j + c) ^2(xiyj+c)2,c∈[−m,m]c \in[-m, m]c[m,m]

接下来我们就是要求
∑i=1n(xi−yi+c)2∑i=1n(xi2+yi2+2c(xi−yi)+c2−2xiyi)\sum_{i = 1} ^{n} (x_i - y_i + c) ^2\\ \sum_{i = 1} ^{n} (x_i ^ 2 + y_i ^ 2 + 2c(x_i - y_i) + c ^ 2 - 2x_iy_i)\\ i=1n(xiyi+c)2i=1n(xi2+yi2+2c(xiyi)+c22xiyi)
除去最后一项,前面的都是定值,无非就是枚举ccc,check一下∑i=1n2c(xi−yi)+c2\sum\limits_{i = 1} ^{n} 2c(x_i - y_i) + c ^ 2i=1n2c(xiyi)+c2的最小值嘛,

但是不难发现这是一个开口向上得二次函数,所以最小值可以直接通过对称轴O(1)O(1)O(1)求得,

所以我们要让∑i=1nxiyi\sum\limits_{i = 1} ^{n}x_i y_ii=1nxiyi最大,也就是∑i=1nxiyi+t\sum\limits_{i = 1} ^{n}x_iy_{i + t}i=1nxiyi+t最大

我们翻转xxx,得到∑i=1nxn−i+1yi+t\sum\limits_{i = 1} ^{n} x_{n - i + 1} y_{i + t}i=1nxni+1yi+t最大,这就是一个多项式卷积的形式了

代码

/*Author : lifehappy
*/
#include <bits/stdc++.h>using namespace std;typedef long long ll;const double pi = acos(-1.0);const int N = 1e6 + 10;struct Complex {double r, i;Complex(double _r = 0, double _i = 0) : r(_r), i(_i) {}}a[N], b[N];Complex operator + (const Complex & a, const Complex & b) {return Complex(a.r + b.r, a.i + b.i);
}Complex operator - (const Complex & a, const Complex & b) {return Complex(a.r - b.r, a.i - b.i);
}Complex operator * (const Complex & a, const Complex & b) {return Complex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}int r[N];void fft(Complex * f, int lim, int rev) {for(int i = 0; i < lim; i++) {if(r[i] < i) {swap(f[i], f[r[i]]);}}for(int i = 1; i < lim; i <<= 1) {Complex wn = Complex(cos(pi / i), rev * sin(pi / i));for(int p = i << 1, j = 0; j < lim; j += p) {Complex w = Complex(1, 0);for(int k = 0; k < i; k++, w = w * wn) {Complex x = f[j + k], y = w * f[i + j + k];f[j + k] = x + y, f[i + j + k] = x - y;}}}if(rev == -1) {for(int i = 0; i < lim; i++) {f[i].r /= lim;}}
}void get_r(int lim) {for(int i = 0; i < lim; ++i) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);ll ans = 0, res = 0;int n, m, lim = 1;scanf("%d %d", &n, &m);for(int i = 1; i <= n; i++) {scanf("%lf", &a[n - i + 1].r); }for(int i = 1; i <= n; i++) {scanf("%lf", &b[i].r);b[i + n]= b[i];}for(int i = 1; i <= n; i++) {ans += a[i].r * a[i].r + b[i].r * b[i].r;res += a[i].r - b[i].r;}ll c1 = floor(res * 1.0 / n), c2 = ceil(res * 1.0 / n);ans += min(n * c1 * c1 - 2 * c1 * res, n * c2 * c2 - 2 * c2 * res);n <<= 2;while(lim < n) lim <<= 1;n >>= 2;get_r(lim);fft(a, lim, 1);fft(b, lim, 1);for(int i = 0; i < lim; i++) {a[i] = a[i] * b[i];}fft(a, lim, -1);res = 0;for(int i = 1; i <= n; i++) {res = max(res, ll(a[i + n].r + 0.5));}printf("%lld\n", ans - 2 * res);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF623E Transforming Sequence(多项式/倍增fft/动态规划)

CF623E Transforming Sequence 经典的倍增NTT题目&#xff0c;但是由于万恶的模数导致这道题变成了倍增MTT 要求n个数前缀或严格递增的序列个数&#xff0c;一共有k位。 然后我们考虑进行dp&#xff0c;然后我的思路就是fi,jf_{i,j}fi,j​表示前i位在k位中有j位的方案数&…

2019-02-26-算法-进化(字符串转换成整数)

题目描述&#xff1a; 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#xff0c;则将该符号与之后…

通过Service访问应用 (1)

目录通过Service访问应用 通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用通过之前的操作&#xff0c;应用部署完成了&#xff0c;我们的Demo网站已经成功启动了&#xff0c;那么如何访问网站呢&#xff1f;通过Pod IP访问应用我们可以通过Pod IP…

P4239 任意模数多项式乘法逆(多项式/ MTT)

P4239 任意模数多项式乘法逆 这个题目简直就是毒瘤&#xff0c;不过还好我们可以使用vector封装要不然真的没法看&#xff0c;现在我们就会用vector封装MTT了&#xff0c;然后有一个代码细节就是这里的求逆还是在模意义下的&#xff0c;所以我们还是需要求逆。 #include<b…

多项式求逆模板(NTT + mod)

【模板】多项式乘法逆 /*Author : lifehappy */ #include <bits/stdc.h>using namespace std;typedef long long ll;const int N 1e6 10, mod 998244353, G 3;int r[N], n;ll a[N], b[N], c[N];ll quick_pow(ll a, int n) {ll ans 1;while(n) {if(n & 1) ans …

2019-02-26-算法-进化(回文数)

题目描述&#xff1a; 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 示例 1: 输入: 121 输出: true示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为…

POJ1742 Coins(DP)

Coins 思路 没分析复杂度写了个二进制拆分&#xff0c;然后做010101背包O(nlog(c)m)>10e7了O(nlog(c)m) > 10e7了O(nlog(c)m)>10e7了&#xff0c;所以还是想办法优化吧。 我们引入一个needneedneed数组&#xff0c;need[j]need[j]need[j]表示&#xff0c;在枚举到第…

13张PPT带你了解主动式消息队列处理集群

前言偷偷和你们说&#xff0c;我搞了一份内部资料&#xff0c;该内部资料共有13张PPT&#xff0c;据作者透露&#xff0c;该PPT至少花了整整1周时间才编写完成&#xff0c;其内容简洁明了&#xff0c;内容深度足够&#xff0c;易于初学者理解&#xff0c;也给深度开发人员分享了…

CF773F Test Data Generation(倍增FFT/动态规划)

CF773F Test Data Generation https://www.luogu.com.cn/problem/CF773F 这个题还是挺巧妙的&#xff0c;最后需要我们求解的实际上值域为a选择奇数个数最大数是奇数的方案数&#xff0c;然后这个东西显然包含了3个信息&#xff0c;值域、个数、最后一个数的奇偶性&#xff0c…

2019-02-27-算法-进化(寻找两个有序数组的中位数)

题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数&#xff0c;并且要求算法的时间复杂度为 O(log(m n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 [1, 3] nums2 [2]则中位数是 2.0示例 2: nums1 [1, 2]…

.Net Core 三大Redis客户端对比和使用心得

前言稍微复杂一点的互联网项目&#xff0c;技术选型都可能会涉及Redis&#xff0c;.NetCore的生态越发完善&#xff0c;支持.NetCore的Redis客户端越来越多&#xff0c;下面三款常见的Redis客户端&#xff0c;相信大家平时或多或少用到一些&#xff0c;结合平时对三款客户端的使…

2020第十一届蓝桥杯软件类省赛第二场C/C++ 大学 B 组(题解)

试题 A: 门牌制作 问题描述 小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户&#xff0c;门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff0c;最后根据需要将字 符粘贴到门牌上&#xff0c;例如门牌 1017 需要依次粘贴字符 …

队长开卖自家产“翠香”猕猴桃

猕猴桃品种有很多&#xff0c;但不是所有的果子都叫翠香。这两天我在公众号里卖了这个翠香猕猴桃&#xff0c;可能是有同学以为是做广告卖水果&#xff0c;其实是家里的亲戚猕猴桃成熟了&#xff0c;辛苦一年下来地里一共结了3000斤猕猴桃&#xff0c;遇到了一个难题就是如何把…

Java修炼之路——基础篇——Java集合类

集合类的全景图 常用集合类特性 1. Collection&#xff1a;每个位置对应一个元素1.1: List 存放有序元素&#xff0c;允许重复元素&#xff0c;允许元素为null1.1.1: ArrayList&#xff1a;内部结构为数组&#xff1b;初始容量为10&#xff1b;插入、删除的移动速度慢&#x…

1575 Gcd and Lcm

1575 Gcd and Lcm ∑i1n∑j1i∑k1ilcm(gcd(i,j),gcd(i,k))设f(n)∑i1n∑j1nlcm(gcd(i,n),gcd(j,n))f(p)3p2−3p1f(pk)(2k1)(p2k−p2k−1)pk−1\sum_{i 1} ^{n} \sum_{j 1} ^{i} \sum_{k 1} ^{i} lcm(gcd(i, j), gcd(i, k))\\ 设f(n) \sum_{i 1} ^{n} \sum_{j 1} ^{n} lcm…

UVA12298 Super Poker II(多项式/背包问题)

UVA12298 Super Poker II 这应该是最水的背包问题了吧 然后有一个小问题就是这道题没有给模数&#xff0c;然后答案会爆int&#xff0c;所以我们需要MTT&#xff0c;然后开long long就好了&#xff0c;或者直接fft&#xff0c;有可能会爆精度。

Java修炼之路——基础篇——Java集合类详解1

SynchronizedList和Vector的区别 java.util.Vector java.util.Collections.$SynchronizedList Vector用同步方法&#xff0c;SynchronizedList用同步代码块&#xff0c;SynchronizedList可以指定锁定的对象 SynchronizedList有很好的扩展和兼容功能&#xff0c;能把所有List的子…

小卓.NET中文编程特点介绍

大家好&#xff0c;我在介绍一下我的全新编程语言&#xff0d;卓语言。小卓编程是卓语言的一个开发工具&#xff0c;可以在里面实现绘图、动画、事件响应等等功能。关于中文编程&#xff0c;一直以来都有争议。我针对以往中文编程的缺点而开发了一种全新的编程语言。首先 &…

P5748 集合划分计数(贝尔数/多项式)

P5748 集合划分计数 求解从1到1e5的所有贝尔数&#xff0c;我们可以利用生成函数求解&#xff0c;就是利用指数型生成函数求解 代码细节&#xff1a; 首先虽然exe^xex代表全是1&#xff0c;但是多项式下面还有阶乘逆元的系数&#xff0c;然后乘完之后&#xff0c;我们还有乘…

2019-02-28-算法-进化(盛最多水的容器)

题目描述 给定 n 个非负整数 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以…