并不对劲的bzoj4827:loj2020:p3723:[AHOI/HNOI2017]礼物
题目大意
有两个长度为\(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]礼物的更多相关文章
- 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告
P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...
- [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)
题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...
- P3723 [AH2017/HNOI2017]礼物
题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1 c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...
- 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)
传送门 首先,两个数同时增加自然数值相当于只有其中一个数增加(此增加量可以小于0) 我们令$x$为当前的增加量,${a},{b}$分别为旋转后的两个数列,那么$$ans=\sum_{i=1}^n(a_ ...
- 洛谷P3723 [AH2017/HNOI2017]礼物
吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...
- AHOI/HNOI2017 礼物
题目链接:戳我 对于题目中给的式子:(大家暂且把\(y_i\)当作\(y_{i+k}\)来看啦qwq) \(\sum_{i=1}^{n}(x_i-(y_i+c))^2\) \(=\sum_{i=1}^ ...
- LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)
传送门 解题思路 首先我们设变化量为\(r\),那么最终的答案就可以写成 : \[ ans=min(\sum\limits_{i=1}^n(a_i-b_i+r)^2) \] \[ ans=min(\s ...
- loj#2020 「AHOI / HNOI2017」礼物 ntt
loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...
- 「AHOI / HNOI2017」单旋
「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...
随机推荐
- zoj 1251 Box of Bricks
Box of Bricks Time Limit: 2 Seconds Memory Limit: 65536 KB Little Bob likes playing with his bo ...
- MD5散列算法的示例
在很多地方,都用到了数据加密,比较多的就是MD5了,也比较安全,下面就贴上个示例,输入一串字符串,通过MD5加密 加密算法如下 public static string MD5_Encrypt(str ...
- Thread 1 cannot allocate new log 的处理办法
ALTER SYSTEM ARCHIVE LOG Thread 1 cannot allocate new log, sequence 2594 Checkpoint not complete 这个实 ...
- Java多线程干货系列—(二)synchronized
原文地址:http://tengj.top/2016/05/03/threadsynchronized2/ <h1 id="前言"><a href="# ...
- BZOJ1775: [Usaco2009 Dec]Vidgame 电视游戏问题
n<=50个游戏机有花费,每个游戏机有Gi<=10种游戏,每种游戏有花费有收益,买了游戏机才能玩对应游戏,求最大收益. 这就是一个背包!不过有依存关系,就不会了! 方法一:f[i][j]表 ...
- 怎么删除"自豪地采用WordPress"
wordpress刚刚安装完毕,打开默认的主页,会发现底部有这样的一行文字:“自豪地采用WordPress”.当然了,我们做一个网站,不一定需要这些文字,我们可以删除或者修改这些文字.今天,小编就来教 ...
- wordpress网站后台打开速度很慢解决方法?
今天就和朋友们分享下,wordpress网站后台最近打开速度很慢的原因及解决方法.推荐第三种方法 方法/步骤 1.安装插件:在插件中搜索 Disable Google Fonts,选择安装,然后启 ...
- python学习之 -- 数据序列化
json / pickle 数据序列化 序列化定义:把变量从内存中变成可存储或传输的过程称为序列化.反序列化:把变量内容从序列化的对象重新读到内存里称为反序列胡. 序列化模块之--pickle使用注意 ...
- Netflix是什么,与Spring Cloud有什么关系
说明:以下总结的观点不一定准确,但是是最好理解的. 1.首先,Netflix是一家做视频的网站,可以这么说该网站上的美剧应该是最火的. 2.Netflix是一家没有CTO的公司,正是这样的组织架构能使 ...
- 【python】Python的字典get方法:从字典中获取一个值
转自: http://blog.sina.com.cn/s/blog_6be89284010183xm.html