题目大意

有两个长度为\(n\)(\(n\leq5*10^4\))的数列\(x_1,x_2,...,x_n\)和\(y_1,y_2,...,y_n\),两个数列里的数都不超过\(m\)(\(m\leq100\))

现在可以进行“(1)把\(x\)中的所有数同时加上一个值”和“\(i<n\)时,\((2)x_i\)变成\(x_{i+1}\);\(i=n\)时,\(x_i\)变成\(x_1\)”这两种操作

操作任意次,使\(\Sigma_{i=1}^{n}{(x_i-y_i)^2}\)最小

题解

设(1)操作加上的值为\(k\),(2)操作执行了\(j\)次;定义\(add(a,b)\)在\(a+b\leq n\)时为\(a+b\),否则为\(a+b-n\)

那么就是要选出合适的\(k,j\),使\(\Sigma_{i=1}^{n}{(x_i+k-y_{add(i,j)})^2}\)最小

该式=\(\Sigma_{i=1}^{n}{(x_i^2+k^2-y_{add(i,j)}^2+2*x_i*k-2*x_i*y_{add(i,j)}-2*k*y_{add(i,j)})}\)

=\((\Sigma_{i=1}^{n}x_i^2)+(\Sigma_{i=1}^{n}y_i^2)+n*k^2+(\Sigma_{i=1}^{n}{(2*x_i*k-2*x_i*y_{add(i,j)}-2*k*y_{add(i,j)})})\)

其中\((\Sigma_{i=1}^{n}x_i^2)+(\Sigma_{i=1}^{n}y_i^2)\)是定值,要让剩下的部分\(n*k^2+(\Sigma_{i=1}^{n}{(2*x_i*k-2*x_i*y_{add(i,j)}-2*k*y_{add(i,j)})})\)更小

该式=\(n*k^2+(\Sigma_{i=1}^{n}{(2*k*(x_i-y_{add(i,j)})-2*x_i*y_{add(i,j)}})\)

=\(n*k^2+(\Sigma_{i=1}^{n}{2*k*(x_i-y_{add(i,j)})})-(\Sigma_{i=1}^{n}{2*x_i*y_{add(i,j)}})\)

=\(n*k^2+2*k*((\Sigma_{i=1}^{n}{x_i})-(\Sigma_{i=1}^{n}{y_i}))-(\Sigma_{i=1}^{n}{2*x_i*y_{add(i,j)}})\)

将它分成两部分,第一部分是\(n*k^2+2*k*((\Sigma_{i=1}^{n}{x_i})-(\Sigma_{i=1}^{n}{x_i}))\),第二部分是\((\Sigma_{i=1}^{n}{2*x_i*y_{add(i,j)}})\)

第一部分只和\(k\)有关,第二部分只和\(j\)有关

那就可以分别算出\(k\)为\(-m\)到\(m\)时第一部分的取值,分别算出\(j\)为\(0\)到\(n-1\)时第二部分的取值,再枚举\(k,j\)的值

发现第二部分是个卷积式,算这部分的时间复杂度围为\(\Theta(n*log n)\)

总时间复杂度是\(\Theta(n*log n+n*m)\)

代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define maxn 50010
#define maxm (maxn*6)
#define inf 2147483647
#define LL long long
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar('\n');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
return;
}
const LL mod = 998244353;
int ans,m,n,fakeans[maxn],x[maxn],y[maxn],sumx,sumy,ans2,a[maxm],b[maxm],nown,len,r[maxm];
int mul(int x,int y){int res=1;while(y){if(y&1)res=(LL)res*(LL)x%mod;x=(LL)x*(LL)x%mod,y>>=1;}return res;}
void dnt(int * c,int f)
{
rep(i,0,nown-1){r[i]=(r[i>>1]>>1)|((i&1)<<(len-1));}
rep(i,0,nown-1){if(i<r[i])swap(c[i],c[r[i]]);}
for(int i=1;i<nown;i<<=1)
{
int wn=mul(3,(mod-1)/(i<<1)),xx,yy;
if(f==-1)wn=mul(wn,mod-2);
for(int j=0;j<nown;j+=(i<<1))
{
int w=1;
rep(k,0,i-1)xx=c[j+k]%mod,yy=(LL)w*(LL)c[j+i+k]%mod,c[j+k]=(xx+yy)%mod,c[j+i+k]=(xx-yy+mod)%mod,w=(LL)w*(LL)wn%mod;
}
}
if(f==-1){int inv=mul(nown,mod-2);rep(i,0,nown-1)c[i]=(LL)c[i]*(LL)inv%mod;}
}
int main()
{
n=read(),m=read();
rep(i,1,n)x[i]=read(),sumx+=x[i],ans2+=x[i]*x[i];
rep(i,1,n)y[i]=read(),sumy+=y[i],ans2+=y[i]*y[i];
rep(i,0,n-1)a[i]=x[i+1];
rep(i,n,(n<<1)-1)a[i]=x[i-n+1];
rep(i,0,n)b[i]=y[n-i]*2;
for(nown=1,len=0;nown<(n+n+n-1);nown<<=1)len++;
dnt(a,1),dnt(b,1);
rep(i,0,nown-1)a[i]=(LL)a[i]*(LL)b[i]%mod;
dnt(a,-1);
rep(i,0,n-1)fakeans[i]=a[i+n-1];
ans=inf;
rep(k,-m,m)rep(j,0,n-1)ans=min(ans,2*k*(sumx-sumy)+n*k*k-fakeans[j]);
write(ans+ans2);
return 0;
}
/*
5 6
1 2 3 4 5
6 3 3 4 5
*/
一些感想

还有一百天左右!

并不对劲的bzoj4827:loj2020:p3723:[AHOI/HNOI2017]礼物的更多相关文章

  1. 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告

    P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...

  2. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  3. P3723 [AH2017/HNOI2017]礼物

    题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1      c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...

  4. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)

    传送门 首先,两个数同时增加自然数值相当于只有其中一个数增加(此增加量可以小于0) 我们令$x$为当前的增加量,${a},{b}$分别为旋转后的两个数列,那么$$ans=\sum_{i=1}^n(a_ ...

  5. 洛谷P3723 [AH2017/HNOI2017]礼物

    吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...

  6. AHOI/HNOI2017 礼物

    题目链接:戳我 对于题目中给的式子:(大家暂且把\(y_i\)当作\(y_{i+k}\)来看啦qwq) \(\sum_{i=1}^{n}(x_i-(y_i+c))^2\) \(=\sum_{i=1}^ ...

  7. LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)

    传送门 解题思路 首先我们设变化量为\(r\),那么最终的答案就可以写成 : \[ ans=min(\sum\limits_{i=1}^n(a_i-b_i+r)^2) \] \[ ans=min(\s ...

  8. loj#2020 「AHOI / HNOI2017」礼物 ntt

    loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...

  9. 「AHOI / HNOI2017」单旋

    「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...

随机推荐

  1. Java SSH框架系列:用户登录模块的设计与实现思路

    1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...

  2. 2016 Multi-University Training Contest 2 solutions BY zimpha

    Acperience 展开式子, \(\left\| W-\alpha B \right\|^2=\displaystyle\alpha^2\sum_{i=1}^{n}b_i^2-2\alpha\su ...

  3. [USACO08OPEN]牛的车Cow Cars

    题目描述 N (1 <= N <= 50,000) cows conveniently numbered 1..N are driving in separate cars along a ...

  4. msp430项目编程04

    msp430中项目---TFT彩屏显示 1.TFT彩屏工作原理 2.电路原理说明 3.代码(静态显示) 4.代码(动态显示) 5.项目总结 msp430项目编程 msp430入门学习

  5. PAT (Advanced Level) 1038. Recover the Smallest Number (30)

    注意前导零的消去. #include <iostream> #include <string> #include <sstream> #include <al ...

  6. uva 11691

    贪心 ~~ 使用优先队列 #include <cstdio> #include <cstdlib> #include <cmath> #include <se ...

  7. codeforces 873E(枚举+rmq)

    题意 有n(n<=3000)个人参与acm比赛,每个人都有一个解题数,现在要决定拿金牌的人数cnt1,拿银牌的人数cnt2,拿铜牌的人数cnt3,各自对应一个解题数区间[d1,c1],[d2,c ...

  8. 纯Java Web项目下的Session共享方案收集(待实践)

    1.使用filter方法存储 这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简单容易控制. 可以使用memcached-session-filter 官方网 ...

  9. Java 8中的时间

    Java 8中的时间 学习了:https://blog.csdn.net/sun_promise/article/details/51383618

  10. Android开发艺术-第二章 IPC 机制

    2.1 Android IPC 简单介绍 IPC 意为进程间通信或者跨进程通信,线程是 CPU 调度的最小单元,是一种有限的系统资源. 进程一般指一个执行单元.不论什么操作系统都须要对应的 IPC 机 ...