题目大意:

两个环之间的差异度定义为$\sum_{i=1}^n (a_i-b_i)^2$

可以进行两种操作 对其中一个环加上$c,m \geq c \geq 0$与对环进行旋转

思路:

对其中一个环加上非负整数相当于对于一个环加$c,c\in[-m,m]$

则设a环转了$j$,则差异度为$\sum_{i=1}^n (a_{i+j}+c-b_i)^2$

$\sum_{i=1}^n ({a_i}^2+{b_i}^2+c^2+2*c*(a_i-b_i)-2*a_{i+j}*b_i)$

由于$c$的范围很小,枚举$c$后除了最后一项都是可以可以快速算出来的

发现对于每一个$j$,$a$与$b$的下标之差为$j$考虑把其中一个数组倒序

则转化为卷积形式 使用$fft$

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 #define ll long long
12 #define db double
13 #define inf 2139062143
14 #define MAXN 200100
15 #define MOD 998244353
16 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
17 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
18 #define ren for(register int i=fst[x];i;i=nxt[i])
19 #define pb(i,x) vec[i].push_back(x)
20 #define pls(a,b) (a+b)%MOD
21 #define mns(a,b) (a-b+MOD)%MOD
22 #define mul(a,b) (1LL*(a)*(b))%MOD
23 using namespace std;
24 inline int read()
25 {
26     int x=0,f=1;char ch=getchar();
27     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
28     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
29     return x*f;
30 }
31 int n,m,rev[MAXN],l2[MAXN],a1[MAXN],a2[MAXN];
32 const db pi=acos(-1);db sum,ans=inf;
33 struct Cd{db x,y;Cd(db X=0,db Y=0) {x=X,y=Y;}}a[MAXN],b[MAXN];
34 Cd operator + (Cd a,Cd b) {return (Cd){a.x+b.x,a.y+b.y};}
35 Cd operator - (Cd a,Cd b) {return (Cd){a.x-b.x,a.y-b.y};}
36 Cd operator * (Cd a,Cd b) {return (Cd){a.x*b.x-a.y*b.y,a.y*b.x+a.x*b.y};}
37 int q_pow(int x,int t,int res=1)
38 {
39     for(;t;t>>=1,x=mul(x,x))
40         if(t&1) res=mul(res,x);
41 }
42 void fft(Cd *a,int n,int f)
43 {
44     rep(i,0,n-1) if(i<rev[i]) swap(a[i],a[rev[i]]);
45     for(int i=1;i<n;i<<=1)
46     {
47         Cd wn(cos(pi/i),f*sin(pi/i));
48         for(int j=0;j<n;j+=i<<1)
49         {
50             Cd w(1,0),x,y;
51             for(int k=0;k<i;k++,w=w*wn)
52                 x=a[k+j],y=a[i+k+j]*w,a[k+j]=x+y,a[i+k+j]=x-y;
53         }
54     }
55     if(f==1) return ;rep(i,0,n-1) a[i].x/=(db)n;
56 }
57 void solve(Cd *a,Cd *b,int sum)
58 {
59     int t=l2[sum]+1,lmt=1<<t;
60     rep(i,0,lmt-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(t-1));
61     fft(a,lmt,1);fft(b,lmt,1);rep(i,0,lmt-1) a[i]=a[i]*b[i];
62     fft(a,lmt,-1);
63 }
64 int main()
65 {
66     n=read(),m=read();int lmt,t;
67     rep(i,0,n-1) a1[i]=read();rep(i,0,n-1) a2[i]=read();
68     l2[0]=-1;rep(i,1,n<<2) l2[i]=l2[i>>1]+1;lmt=1<<l2[n<<1]+1;
69     rep(i,0,n-1) a[i].x=a1[i],sum+=a1[i]*a1[i]+a2[i]*a2[i],t+=2*(a1[i]-a2[i]);
70     rep(i,0,n-1) a[i+n].x=a[i].x,b[i].x=a2[n-1-i];
71     solve(a,b,n<<1);
72     rep(x,-m,m)    rep(i,n-1,2*n-1) ans=min(ans,sum-t*x+n*x*x-2*round(a[i].x));
73     printf("%.0lf\n",ans);
74 }

View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/10521136.html

bzoj 4827 礼物相关推荐

  1. bzoj #4827 礼物(FFT)(HNOI2017)

    标签:FFT Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定 ...

  2. [BZOJ 4827][Hnoi2017]礼物

    4827: [Hnoi2017]礼物 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1091  Solved: 748 [Submit][Statu ...

  3. bzoj 3055礼物运送 floyed + 状压DP

    bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...

  4. bzoj 4827 [Hnoi2017]礼物——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...

  5. BZOJ 4827 [Hnoi2017]礼物 ——FFT

    题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...

  6. 【刷题】BZOJ 4827 [Hnoi2017]礼物

    Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...

  7. BZOJ 2142 礼物(拓展Lucas,中国剩余定理)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2142 是 hydro 的 BZOJ ...

  8. bzoj 2142 礼物

    题目大意: $n$件礼物,送给$m$个人,其中送给第$i$个人礼物数量为$w_i$,求送礼物的方案数 思路: 显然答案为$\binom{n}{w_1} \binom{n-w_1}{w_2} \cdot ...

  9. [BZOJ]2142 礼物 扩展Lucas

    2142: 礼物 Time Limit: 10 Sec   Memory Limit: 259 MB Submit: 1788   Solved: 748 [ Submit][ Status][ Di ...

  10. bzoj 3055 礼物运送

    首先处理出两点之间最短路,设状态f[i][j]表示j状态下结尾为i的最短路,所以有转移f[i][j]=f[k][j|(1<<(k-1))]+dis[i][k]; 初状态就是f[i][(1& ...

最新文章

  1. LNMP架构详解(1)——了解架构的基本信息
  2. Linux 4.0 里,你可能再也不需要重启你的操作系统。
  3. this.parentNode.nextSibling 对div里的换行敏感
  4. 帮助你构建自适应布局的30款优秀 jQuery 插件(下篇)
  5. 不叫K50 Pro+!Redmi K50系列超大杯或有新名称
  6. isinstance 判断归属
  7. 软件工程 第四章 概要设计
  8. mysql正则表达式教学视频教程_MySQL正则表达式入门教程
  9. 启明星Exchange/outlook预定会议室终端显示解决方案
  10. 软件测试的方法有哪些?
  11. 车辆颜色分类网络—BeerNet
  12. 【全网世界区划最全整理输出之第二部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第二部分到8167行,总条数:21088
  13. 【软件推荐】还用着Windows自带的看图软件吗?
  14. 兔子能不能跑得过乌龟
  15. 炼数成金--支持向量机 笔记
  16. 安卓开发——升级compileSdkVersion、targetSdkVersion、buildToolsVersion、support包到最新(28)问题解决
  17. Given no hashes to check 131 links for project 'pip': discarding no candidates
  18. Oracle MySQL Hive sql进行相邻数据相减、相加等运算 lad lead 窗口函数 偏移函数
  19. 深入理解JVM的对象创建过程
  20. 海康威视插件播放视频流

热门文章

  1. 计算机 外存储能直接被cpu处理??,cpu可直接处理外存上的信息吗?_常见问题解析...
  2. BGP中的联盟原理和实验(华为设备)
  3. Pycharm乱码解决大全
  4. web基础、tomcat搭建
  5. L325 如何睡觉
  6. 漫画 | Redis常见面试问题
  7. Java内存与垃圾回收调优
  8. webstorm开发微信小程序
  9. mysql之高性能索引
  10. 替罪羊树模板(封装版)-----转自知乎