再谈FFT,不过如此。应该是这个题简单
来源:互联网 发布:淘宝的xbox手柄 编辑:程序博客网 时间:2024/05/29 08:17
现在有n个元素ai,表示有t组数据对于每组数据:第一行两个整数n,q。表示有n(1≤n≤100000)个元素,q(1≤q≤100000)次询问第二行n个整数ai(1≤ai≤100000),表示每个元素的大小。接下来q行,每行一个k(1≤k≤200000)
然后现在有Q个询问,每次月大叔想问一共有多少对pair,满足a[i]+a[j]>=k(其中 i<j)
INPUT
输入第一行包含一个正整数t(1≤t≤100)
,表示询问。
OUTPUT
对于每组测试数据的询问,输出有多少对即可。
分析:FFT预处理出来每两个数的和。然后O(1)询问即可。记住去重
分析:FFT预处理出来每两个数的和。然后O(1)询问即可。记住去重
#include<bits/stdc++.h>using namespace std;const double PI=acos(-1.0);typedef long long ll;//模板部分-------------------------------------------------------------struct Complex{ double r,i; Complex(double _r = 0.0,double _i = 0.0) { r = _r; i = _i; } Complex operator +(const Complex &b) { return Complex(r+b.r,i+b.i); } Complex operator -(const Complex &b) { return Complex(r-b.r,i-b.i); } Complex operator *(const Complex &b) { return Complex(r*b.r-i*b.i,r*b.i+i*b.r); }};/* * 进行FFT和IFFT前的反转变换。 * 位置i和 (i二进制反转后位置)互换 * len必须去2的幂 */void change(Complex y[],int len){ int i,j,k; for(i = 1, j = len/2;i < len-1; i++) { if(i < j)swap(y[i],y[j]); //交换互为小标反转的元素,i<j保证交换一次 //i做正常的+1,j左反转类型的+1,始终保持i和j是反转的 k = len/2; while( j >= k) { j -= k; k /= 2; } if(j < k) j += k; }}/* * 做FFT * len必须为2^k形式, * on==1时是DFT,on==-1时是IDFT */void fft(Complex y[],int len,int on){ change(y,len); for(int h = 2; h <= len; h <<= 1) { Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h)); for(int j = 0;j < len;j+=h) { Complex w(1,0); for(int k = j;k < j+h/2;k++) { Complex u = y[k]; Complex t = w*y[k+h/2]; y[k] = u+t; y[k+h/2] = u-t; w = w*wn; } } } if(on == -1) for(int i = 0;i < len;i++) y[i].r /= len;}//模板部分--------------------------------------------------Complex x1[400010];int a[100001];ll num[400001];int main(){ int t; scanf("%d",&t); while(t--) { memset(num,0,sizeof(num)); int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%d",&a[i]); num[a[i]]++; } sort(a,a+n); //FFT预处理过程-------------------------------------------------- int len1=a[n-1]+1; int len=1; while(len < len1*2)len<<=1; for(int i = 0;i < len1;i++) x1[i] = Complex(num[i] , 0); for(int i = len1;i < len;i++) x1[i] = Complex(0 , 0); fft(x1,len,1); for(int i = 0;i < len;i++) x1[i] = x1[i]*x1[i]; fft(x1,len,-1); for(int i = 0;i < len;i++) num[i] = (ll)(x1[i].r+0.5); //FFT预处理过程-------------------------------------------- len=2*a[n-1]; for(int i=0;i<n;i++)//同一个位置不可以相加 { num[a[i]+a[i]]--; } for(int i=1;i<=len;i++)//i<j,所以每一个都算了两遍 { num[i]/=2; num[i]+=num[i-1]; } while(m--) { int k;scanf("%d",&k); if(k>len) printf("0\n"); else { printf("%lld\n",num[len]-num[k-1]); } } } return 0;}
阅读全文
1 0
- 再谈FFT,不过如此。应该是这个题简单
- 不过如此
- 加班应该是这个样子的
- 这个应该是PHP的bug吧
- php采集程序,大概应该是这个思路
- 生活不过如此简单,小狗也有小狗的烦恼
- FFT简单解释
- [压位 || FFT] 【Hillan 的题】简单字符串匹配
- 2014年360的首要任务应该是这个
- 小米MIX2有什么缺点?这个应该是最致命的!
- PHP不应该是简单的拷贝粘贴
- 人生不过如此
- 人生不过如此
- 人生不过如此
- 等不过如此
- 旅游优惠题。这个比较简单
- 以前也有过楼主这个阶段,工作两年感觉前端不过如此,不过后来还是逐渐突破了。尤其是使用了angularJS后。 现在转去做C++开发,对比后发现前端实在是太简单了,别喷我,个人想法,当初也是觉得JS水
- [FFT] FFT的一些无聊板子题
- HDU1042 N!
- 六.gradle的自定义任务
- 邻接矩阵 建图
- 关于前端脚手架yeoman的使用
- Java 7之基础
- 再谈FFT,不过如此。应该是这个题简单
- UML类图几种关系的总结
- DDR的几个概念
- mysql-B-Tree and Hash Indexes
- js框架与库的区别
- nyoj 20 吝啬的国度【dfs+vector存图】
- 机器学习和深度学习提问题的好地方
- unity5 动画播放结束都有延迟的问题
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)