来自FallDream的博客,未经允许,请勿转载,谢谢。


题意:给你n个数ai,求有多少个数对(i,j,k)满足$1\leqslant i<j<k\leqslant n$且aj*2=ai+ak    n<=100000 ai<=30000

题解:考虑构造一个生成函数,只要把左右的生成函数乘起来,然后枚举i就行了。但是每次平方都需要$nlogn$的时间,总复杂度$n^{2}logn$,不能过。

考虑分块,块外的(即满足$1\leqslant i<L\leqslant j\leqslant R<k\leqslant n$的)用生成函数处理一下,块内的直接暴力算.

块的大小是k的时候,复杂度$k^{2}*\frac{n}{k}+\frac{n}{k}nlogn$,得出k大概等于$\sqrt{nlogn}$时候最小,复杂度$n\sqrt{nlogn}$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define getchar() (*S++)
#define MN 100000
#define pi acos(-1)
#define ll long long
char B[1<<26],*S=B;
using namespace std;
int X;char ch;
inline int read()
{X = 0 , ch = getchar();while(ch < '0' || ch > '9') ch = getchar();while(ch >= '0' && ch <= '9'){X = X * 10 + ch - '0';ch = getchar();}return X;
}struct cp{double r,u;cp(double _r=0,double _u=0):r(_r),u(_u){}cp operator+(cp b){return cp(r+b.r,u+b.u);}cp operator-(cp b){return cp(r-b.r,u-b.u);}cp operator*(cp b){return cp(r*b.r-u*b.u,r*b.u+u*b.r);}cp operator/(double y){return cp(r/y,u/y);}
}w[2][MN],a[MN],b[MN];int n,s[MN+5],size,N;ll num1[MN],num2[MN];
ll ans=0;void init(int mx)
{w[0][0]=w[1][mx]=cp(1,0);w[0][1]=w[1][mx-1]=cp(cos(2*pi/mx),sin(2*pi/mx));for(int i=2;i<=mx;i++)w[0][i]=w[1][mx-i]=w[0][i-1]*w[0][1];
}void fft(cp*x,int b)
{for(register int i=0,j=0;i<N;++i){if(i>j)swap(x[i],x[j]);for(int k=N>>1;(j^=k)<k;k>>=1);}for(register int i=2;i<=N;i<<=1)for(register int j=0;j<N;j+=i)for(register int k=0;k<i>>1;k++){cp t=x[j+k+(i>>1)]*w[b][N/i*k];x[j+k+(i>>1)]=x[j+k]-t;x[j+k]=x[j+k]+t;}if(b)for(register int i=0;i<N;i++)x[i]=x[i]/N;
}int main()
{fread(B,1,1<<26,stdin);n=read();size=min(n,6*(int)sqrt(n));for(register int i=1;i<=n;++i)s[i]=read(),++num2[s[i]];for(register int i=1;i<n;i+=size){int r=min(i+size-1,n);for(register int j=i;j<=r;++j)--num2[s[j]];for(register int j=i;j<=r;++j){for(int k=j+1;k<=r;k++){int x=2*s[j]-s[k];if(x>=0)ans+=num1[x];x=2*s[k]-s[j];if(x>=0)ans+=num2[x];}++num1[s[j]];}}for(register int i=1;i<n;i+=size){int r=min(i+size-1,n),mx=0;for(register int j=1;j<i;++j)a[s[j]].r++,mx=max(mx,s[j]);for(register int j=r+1;j<=n;++j)b[s[j]].r++,mx=max(mx,s[j]);for(N=1;N<=mx;N<<=1);N<<=1;init(N);fft(a,0);fft(b,0);for(register int j=0;j<N;++j)a[j]=a[j]*b[j];fft(a,1);for(register int j=i;j<=r;++j) ans+=(ll)(a[s[j]<<1].r+0.5);memset(a,0,sizeof(cp)*N);memset(b,0,sizeof(cp)*N);}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/FallDream/p/bzoj3509.html

[bzoj3509][CodeChef]COUNTARI相关推荐

  1. BZOJ3509 [CodeChef] COUNTARI 【分块 + fft】

    题目链接 BZOJ3509 题解 化一下式子,就是 \[2A[j] = A[i] + A[k]\] 所以我们对一个位置两边的数构成的生成函数相乘即可 但是由于这样做是\(O(n^2logn)\)的,我 ...

  2. Bzoj3509 [CodeChef] COUNTARI

    Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 912  Solved: 264 Description 给定一个长度为N的数组A[],求有多少对i, ...

  3. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  4. FFT/NTT卷积神级副本

    干货满满的良心博客 传送至只有小怪的村庄--请开始你的逆天之路 A:P1919 B:P4157 刷怪升级--转战玄灵大陆 C:P6300 D:P3763 E:P3321 F:P5641 G:P4986 ...

  5. Fast Fourier Transform

    写在前面的.. 感觉自己是应该学点新东西了.. 所以就挖个大坑,去学FFT了.. FFT是个啥? 坑已补上.. 推荐去看黑书<算法导论>,讲的很详细 例题选讲 1.UOJ #34. 多项式 ...

  6. codechef ANUCBC(背包)

    题目链接: https://www.codechef.com/problems/ANUCBC 按模数进行背包 取模不要直接取,分开写,不然会T #include<cstdio> #incl ...

  7. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  8. CFCC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries

    https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...

  9. codechef INSQ15_A(hash+二分)

    思路:首先计算字符串s的所有后缀的hash值,然后根据p分离的两个字符串的最长公共子串,使用二分查找.具体代码参考: https://github.com/wuli2496/OJ/blob/maste ...

  10. CodeChef Cards, bags and coins [DP 泛型背包]

    https://www.codechef.com/problems/ANUCBC n个数字,选出其一个子集. 求有多少子集满足其中数字之和是m的倍数.n $\le$ 100000,m $\le$ 10 ...

最新文章

  1. win32: 查询滚动条相关信息的注意事项
  2. 网站SEO优化介绍搜索引擎给网站排名的过程
  3. 如何在JavaScript中使用自定义事件
  4. 【java网络编程】用TCP socket实现多线程图片上传
  5. ubuntu sudo apt-get update 失败 解决方法
  6. Oracle的 EXEC SQL CONTEXT学习
  7. yum repolist命令
  8. sas导出数据串行解决方案
  9. Cesium中的Heading/Pitch/Roll
  10. mbedtls 自带SSL demo调试
  11. java lazy实现依赖调用_spring 之 lazy-init Autowired depends-on
  12. Samba共享文件夹Windows中拷贝文件拒绝访问
  13. 在Excel中如何让文字竖排
  14. 2019阿里巴巴Android实习生面经
  15. Python元类---道生一,一生二,二生三
  16. java.lang.NoClassDefFoundError: org/jdom2/Content
  17. 植物神经紊乱,适量进食米饭有什么好处?
  18. 北京某牧场管理企业——牧场智慧管理项目
  19. 在梦中写代码的程序员,比例居然这么高
  20. 2021.icpc网络赛第二场

热门文章

  1. 如何提升Java应用程序性能
  2. 刘强东震怒:疑不满内部拉帮结派人浮于事!
  3. 免费!吴恩达给你的人工智能第一课
  4. dump文件_windows程序崩溃时生成dump文件方法
  5. 24 内置函数 命名元组(namedtuple) ,os ,sys,序列化,pickle,json
  6. Java主类结构:变量与常量
  7. 浪潮之巅--蓝色巨人读后感
  8. IP defragment
  9. js本地存储解决方案(localStorage与userData)
  10. Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode