「AH2017/HNOI2017」礼物
题目链接
\(Solution\)
应为我们可以将任意一个数列加上一个非负整数,即可以变为将一个数列加上一个整数(可以为负),我们将这个整数设为\(z\).所以要求的式子的变为:
\]
首先来化简一下式子
\]
\]
我们可以发现不管如何变化\(\sum_{i=1}^{n}x_i^2+\sum_{i=1}^{n}y_i^2\)的值都不会变.
然后再看看\(\sum_{i=1}^{n}z_i^2+2z\sum_{i=1}^{n}(x_i-y_i)\)显然这是一个关于\(z\)的二次函数.最小值可以\(O(1)\)算出但是注意一下\(z\)必须是整数而且可以为负,所以需要将\(-\frac{x_i-y_i}{n}\)向上和向下取整并带入式子取最小值.
所以我们现在只需要算出\(2\sum_{i=1}^{n}x_i*y_i\)的最大值即可.
这个如何去算,将\(y\)变成链,在进行一次\(fft\)在取一个最大值就好了
\(Code\)
#include<bits/stdc++.h>
#define int long long
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
    while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
    return f*x;
}
const int N=3000001;
const double pi=3.14159265358979323846;
struct node {
    double x,y;
    node operator + (node z)const {
        return (node){x+z.x,y+z.y};
    }
    node operator - (node z)const {
        return (node){x-z.x,y-z.y};
    }
    node operator * (node z)const {
        return (node){x*z.x-y*z.y,y*z.x+x*z.y};
    }
}f[N],g[N];
int r[N],limit=1;
void fft(node *a,int opt){
    for(int i=0;i<=limit;i++)
        if(i<r[i])
            swap(a[i],a[r[i]]);
    for(int i=1;i<limit;i<<=1){
        node w=(node){cos(pi/i),opt*sin(pi/i)};
        for(int j=0;j<limit;j+=i<<1){
            node l=(node){1,0};
            for(int k=j;k<j+i;k++){
                node p=l*a[k+i];
                a[k+i]=a[k]-p;
                a[k]=a[k]+p;
                l=l*w;
            }
        }
    }
}
int a[N],b[N];
main(){
    int n=read(),k=read(),l=0,m=n,js=0,ans=0;
    for(int i=1;i<=n;i++)
        a[i]=f[i].x=read(),f[i+n].x=f[i].x,js+=a[i],ans+=a[i]*a[i];
    for(int i=1;i<=n;i++)
		b[i]=read(),js-=b[i],ans+=b[i]*b[i];
	reverse(b+1,b+n+1);
	for(int i=1;i<=n;i++)
		g[i].x=b[i];
	int A=-floor(js*1.0/n),B=-ceil(js*1.0/n);
	ans+=min(A*A*n+2*A*js,B*B*n+2*B*js);
	n*=2;
	while(limit<=n+m)
        limit<<=1,l++;
    for(int i=0;i<limit;i++)
        r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
    fft(f,1),fft(g,1);
    for(int i=0;i<=limit;i++)
        f[i]=f[i]*g[i];
    fft(f,-1);
	int maxx=0;
    for(int i=m;i<=n+1;i++)
		maxx=max((int)(f[i].x/limit+0.5),maxx);
	printf("%lld",ans-2*maxx);
}
「AH2017/HNOI2017」礼物的更多相关文章
- 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」礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰 ... 
- loj#2020. 「AHOI / HNOI2017」礼物
		题意:给定xy数组求 \(\sum_{i=0}^{n-1}(x_i+y_{(i+k)\modn}+c)^2\) 题解:先化简可得 \(n*c^2+2*\sum_{i=0}^{n-1}x_i-y_i+\ ... 
- AC日记——「HNOI2017」礼物 LiBreOJ 2020
		#2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ... 
- 「AHOI / HNOI2017」单旋
		「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ... 
- 「AHOI / HNOI2017」影魔
		「AHOI / HNOI2017」影魔 题目描述 解决这类比较复杂的区间贡献问题关键在于找到计算的对象. 比如这道题,我们计算的对象就是区间中间的最大值. 对于点\(i\),我们找到左边第一个比他大的 ... 
- loj #2023. 「AHOI / HNOI2017」抛硬币
		#2023. 「AHOI / HNOI2017」抛硬币 题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个 ... 
- loj #2021. 「AHOI / HNOI2017」大佬
		#2021. 「AHOI / HNOI2017」大佬 题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢 ... 
- [LOJ 2022]「AHOI / HNOI2017」队长快跑
		[LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ... 
随机推荐
- Dbvisualizer设置SQL语句自动提示
			Dbvisualizer默认不自动提示SQL语句的命令及查询的表,虽然可以通过Ctrl+/快捷键进行手动调用出提示信息,用习惯了PLSQL Developer难免有些不适应. 设置自动提示方法: 点击 ... 
- ubuntu10.10手工安装jdk1.6
			声明:以下操作是在root用户下操作. 一.下载JDK首先,在Oracle的官网上下载JDK.http://www.oracle.com/technetwork/java/javase/downloa ... 
- (转)libvirt API的基本概念
			本文摘自:http://blog.sina.com.cn/s/blog_da4487c40102v31i.html libvirt对象 libvirt的对象向外展现了虚拟化环境的所有资源.libvir ... 
- 【HDU5862】Counting Intersections
			题意 有n条线段,且都平行于坐标轴.对于每条线段,给出两个端点的坐标.问一共有多少个线段的交点. 分析 最最简单的扫描法了.用线段树或者树状数组都可以. 由题目可知,线段只有两种,要么平行于x轴要么平 ... 
- SVN的“Invalid authz configuration”错误的解决方法
			公司有人离职后,我把他svn账号删除 然后就报这个错了,我检查了authz文件,完全看不出什么错误.... 网上的各种方法试一遍,无果. 蹲个厕所,继续查这个问题 看到一个答案: 给不存在的组配置权限 ... 
- iOS开发时间控件怎么强制24小时制(小技巧)
			1)当你的format格式是 NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];[dateFo ... 
- Maven详解【面试+工作】  各种安装 没用
			1 Maven介绍1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目组加入 ... 
- Red Hat 6.5 本地yum源的配置
			在没有网络的情况下,想要使用yum源进行软件的安装就显得非常困难了.所以有时候配置本地的yum源也是非常必要的. 准备工作: rad hat 的ISO镜像文件. 1.创建一个文件夹,用于挂载ISO镜像 ... 
- jstack调试core文件
			摘自:https://stackoverflow.com/questions/37331266/jstack-throws-exception-interrogating-a-core // 错误示例 ... 
- JS中的唯一容器:数组
			JS中的唯一容器:数组 一.什么类型的数据都可以存储 二. 定义的方式有两种 1 . var arra=[];var arra=[“a”,“b”,"c"]; 2.v ... 
