Gym100783C Golf Bot(FFT)
https://vjudge.net/problem/Gym-100783C
题意:
给出n个数,然后有m次查询,每次输入一个数x,问x能否由n个数中2个及2个以下的数相加组成。
思路:
题意很简单,但是如果直接去算要超时。
可以利用傅里叶,计算出两个卷积中的数相加的所有可能性。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
using namespace std; #define LL long long
const double PI = acos(-1.0); // 复数结构体
struct Complex
{
double x, y; // 实部和虚部 x + yi
Complex(double _x = 0.0, double _y = 0.0)
{
x = _x;
y = _y;
}
Complex operator - (const Complex &b) const
{
return Complex(x - b.x, y - b.y);
}
Complex operator + (const Complex &b) const
{
return Complex(x + b.x, y + b.y);
}
Complex operator * (const Complex &b) const
{
return Complex(x * b.x - y * b.y, x * b.y + y * b.x);
}
}; // 进行FFT和IFFT前的反转变换
// 位置i和(i二进制反转后的位置)互换
// len必须去2的幂
void change(Complex y[], int len)
{
int i, j, k;
for (i = , j = len / ; i < len - ; i++)
{
if (i < j)
{
swap(y[i], y[j]);
}
// 交换护卫小标反转的元素,i < j保证交换一次
// i做正常的+1,j左反转类型的+1,始终保持i和j是反转的
k = len / ;
while (j >= k)
{
j -= k;
k /= ;
}
if (j < k)
{
j += k;
}
}
return ;
} // FFT
// len必须为2 ^ k形式
// on == 1时是DFT,on == -1时是IDFT
void fft(Complex y[], int len, int on)
{
change(y, len);
for (int h = ; h <= len; h <<= )
{
Complex wn(cos(-on * * PI / h), sin(-on * * PI / h));
for (int j = ; j < len; j += h)
{
Complex w(, );
for (int k = j; k < j + h / ; k++)
{
Complex u = y[k];
Complex t = w * y[k + h / ];
y[k] = u + t;
y[k + h / ] = u - t;
w = w * wn;
}
}
}
if (on == -)
{
for (int i = ; i < len; i++)
{
y[i].x /= len;
}
}
} const int maxn=+; Complex x1[*maxn];
int a[*maxn];
LL num[*maxn]; int main()
{
//freopen("D:\\input.txt","r",stdin);
int n,m;
while(~scanf("%d",&n))
{
memset(num,,sizeof(num));
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
num[a[i]]++;
}
a[n]=; n++; num[]++;
sort(a,a+n);
int len1=a[n-]+;
int len=;
while(len<*len1) len<<=;
for(int i=;i<len1;i++)
x1[i]=Complex(num[i],);
for(int i=len1;i<len;i++)
x1[i]=Complex(,);
fft(x1,len,);
for(int i=;i<len;i++)
x1[i]=x1[i]*x1[i];
fft(x1,len,-);
for(int i=;i<len;i++)
num[i]=(long long)(x1[i].x+0.5);
len=*a[n-];
//for(int i=0;i<n;i++)//减去2次选的同一个数
// num[a[i]+a[i]]--;
//for(int i=1;i<=len;i++) num[i]/=2;//选1 2和选2 1是一样的所以除2 //for(int i=0;i<=10;i++)
//printf("%d: %d\n",i,num[i]);
int ans=;
scanf("%d",&m);
while(m--)
{
int xx;
scanf("%d",&xx);
if(num[xx]) ans++;
}
printf("%d\n",ans);
}
}
Gym100783C Golf Bot(FFT)的更多相关文章
- LA6886 Golf Bot(FFT)
题目 Source https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page= ...
- 快速傅里叶(FFT)的快速深度思考
关于按时间抽取快速傅里叶(FFT)的快速理论深度思考 对于FFT基本理论参考维基百科或百度百科. 首先谈谈FFT的快速何来?大家都知道FFT是对DFT的改进变换而来,那么它究竟怎样改进,它改进的思想在 ...
- 【BZOJ3527】力(FFT)
[BZOJ3527]力(FFT) 题面 Description 给出n个数qi,给出Fj的定义如下: \[Fj=\sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{ ...
- 【BZOJ4827】【HNOI2017】礼物(FFT)
[BZOJ4827][HNOI2017]礼物(FFT) 题面 Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每 ...
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 【BZOJ4503】两个串(FFT)
[BZOJ4503]两个串(FFT) 题面 给定串\(S\),以及带通配符的串\(T\),询问\(T\)在\(S\)中出现了几次.并且输出对应的位置. \(|S|,|T|<=10^5\),字符集 ...
- 【BZOJ4259】残缺的字符串(FFT)
[BZOJ4259]残缺的字符串(FFT) 题面 给定两个字符串\(|S|,|T|\),两个字符串中都带有通配符. 回答\(T\)在\(S\)中出现的次数. \(|T|,|S|<=300000\ ...
- 【51Nod1258】序列求和V4(FFT)
[51Nod1258]序列求和V4(FFT) 题面 51Nod 多组数据,求: \[Ans=\sum_{i=1}^ni^k,n\le 10^{18},k\le50000\] 题解 预处理伯努利数,时间 ...
- 【CF528D】Fuzzy Search(FFT)
[CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...
随机推荐
- 同步机制及windows同步函数的使用
最近面试的许多公司都询问关于多线程的问题,但是问的深度一般不会很难,仅仅问相关的同步问题以及对应的API函数,下面是windows下几个常用的同步方法,对于应付帮助或者一般的开发都非常有用 目录一 临 ...
- 【我的Android进阶之旅】快速创建和根据不同的版本类型(Dev、Beta、Release)发布Android 开发库到Maven私服
前言 由于项目越来越多,有很多公共的代码都可以抽取出一个开发库出来传到公司搭建好的Maven私服,以供大家使用. 之前搭建的Maven仓库只有Release和Snapshot两个仓库,最近由于开发库有 ...
- mysql总结思维导图
mysql总结思维导图.脑图 先整理了一个思维导图出来,到时候再继续补充并且深入挖掘一下,再写博文. 另外,看了很多优秀的博文,在这里先mark一下. https://www.cnblogs.com/ ...
- python web框架 MVC MTV
WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理
- Spark 2.0 PCA主成份分析
PCA在Spark2.0中用法比较简单,只需要设置: .setInputCol(“features”)//保证输入是特征值向量 .setOutputCol(“pcaFeatures”)//输出 .se ...
- maven仓库配置
apache官方提供的maven库下载速度比较慢,所以可以配置成aliyun的maven库,这样在构建项目的时候速度会提升很多,具体方法如下: vim /usr/local/maven/conf/se ...
- 这样才能使本地Mysql服务允许被外部主机连接(两步)
网上的N多方法都不全面,只有下面的第一步或第二步是不行的,必须同时执行下面两步操作: 修改mysql.user表 以root或debian-sys-maint身份登录mysql $ mysql -u ...
- day5-正则表达式 re
re模块用于对python的正则表达式的操作. 字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配 ...
- BZOJ 1316: 树上的询问
挺裸的点分治 刚开始想用map水过去,然后做p次点分治,然后T到自闭 最后发现可以sort一遍,然后去重,记录每个数出现的次数,这样就可以双指针,不会漏掉了 #include <bits/std ...
- openJudge C17K:Lying Island
地址:http://poj.openjudge.cn/practice/C17K/ 题目: C17K:Lying Island 查看 提交 统计 提问 总时间限制: 2000ms 内存限制: 26 ...