思路:

跟今年WC的题几乎一样 (但是这道题有重 不能用bitset水过去)

正解:分块FFT

http://blog.csdn.net/geotcbrl/article/details/50636401    from GEOTCBRL

可以看看hgr的题解..写得很详细

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const double pi=acos(-);
const int N=;
int n,nn,num[N],R[N],L,Block,block[N],cnt[][N];
long long ans;
struct Complex{
double x,y;Complex(){}
Complex(double X,double Y){x=X,y=Y;}
}A[N],B[N],C[N];
Complex operator+(Complex a,Complex b){return Complex(a.x+b.x,a.y+b.y);}
Complex operator-(Complex a,Complex b){return Complex(a.x-b.x,a.y-b.y);}
Complex operator*(Complex a,Complex b){return Complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
Complex operator/(Complex a,int b){return Complex(a.x/b,a.y/b);}
void FFT(Complex *a,int f){
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
for(int i=;i<n;i<<=){
Complex wn=Complex(cos(pi/i),f*sin(pi/i));
for(int j=;j<n;j+=(i<<)){
Complex w=Complex(,);
for(int k=;k<i;k++,w=w*wn){
Complex x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
if(!~f)for(int i=;i<n;i++)a[i]=a[i]/n;
}
int main(){
scanf("%d",&nn);
for(int i=;i<=nn;i++)scanf("%d",&num[i]);
for(n=;n<=;n<<=)L++;
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));
Block=min(int(sqrt(nn)*),nn);
for(int i=;i<=nn;i++)block[i]=(i-)/Block+;
for(int i=;i<=nn;i++)cnt[block[i]][num[i]]++;
for(int I=;I<=block[nn];I++){
int L=lower_bound(block+,block++nn,I)-block,R=upper_bound(block+,block++nn,I)-block-;
for(int j=L;j<=R;j++){
cnt[I][num[j]]--;
for(int i=L;i<j;i++)
if(num[j]*-num[i]>=)ans+=cnt[I][num[j]*-num[i]];
}
}
for(int i=;i<=nn;i++)cnt[][num[i]]++;
for(int I=;I<=block[nn];I++){
int L=lower_bound(block+,block++nn,I)-block,R=upper_bound(block+,block++nn,I)-block-;
for(int i=L;i<=R;i++)cnt[][num[i]]--;
for(int j=L;j<=R;j++)
for(int i=L;i<j;i++)
if(num[j]*-num[i]>=)ans+=cnt[][num[j]*-num[i]];
}
for(int i=;i<=nn;i++)cnt[][num[i]]++;
for(int I=block[nn];I;I--){
int L=lower_bound(block+,block++nn,I)-block,R=upper_bound(block+,block++nn,I)-block-;
for(int i=L;i<=R;i++)cnt[][num[i]]--;
for(int k=L;k<=R;k++)
for(int j=k-;j>=L;j--)
if(num[j]*-num[k]>=)ans+=cnt[][num[j]*-num[k]];
}
for(int I=;I<=block[nn];I++){
for(int i=;i<n;i++)A[i].x=A[i].y=B[i].x=B[i].y=;
int L=lower_bound(block+,block++nn,I)-block,R=upper_bound(block+,block++nn,I)-block-;
for(int i=;i<L;i++)A[num[i]].x++;
for(int i=R+;i<=nn;i++)B[num[i]].x++;
FFT(A,),FFT(B,);
for(int i=;i<n;i++)C[i]=A[i]*B[i];
FFT(C,-);
for(int i=L;i<=R;i++)ans+=(long long)(C[num[i]*].x+0.2);
}
printf("%lld\n",ans);
}

分块FFT哦~

BZOJ 3509 分块FFT的更多相关文章

  1. [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)

    [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...

  2. [BZOJ 3771] Triple(FFT+容斥原理+生成函数)

    [BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...

  3. BZOJ 3509 [CodeChef] COUNTARI ——分块 FFT

    分块大法好. 块内暴力,块外FFT. 弃疗了,抄SX队长$silvernebula$的代码 #include <map> #include <cmath> #include & ...

  4. bzoj 3509: [CodeChef] COUNTARI] [分块 生成函数]

    3509: [CodeChef] COUNTARI 题意:统计满足\(i<j<k, 2*a[j] = a[i] + a[k]\)的个数 \(2*a[j]\)不太好处理,暴力fft不如直接暴 ...

  5. BZOJ 3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 883  Solved: 250[Submit][S ...

  6. CC countari & 分块+FFT

    题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...

  7. CodeChef COUNTARI Arithmetic Progressions(分块 + FFT)

    题目 Source http://vjudge.net/problem/142058 Description Given N integers A1, A2, …. AN, Dexter wants ...

  8. 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶

    第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度 ...

  9. 【做题】codechefCOUNTARI——分块FFT

    记本题数组长度为\(n\),权值大小为\(m\). 首先,暴力显然是\(O(n^2)\)的. 先瞄一眼tag,然后发现这是FFT. 显然,问题的关键在于要满足i,j,k之间的位置关系.于是考虑分治FF ...

随机推荐

  1. 在 ef 中执行 DbContext.Table.AddRange(Enitites).ToList() 会发生什么

    在 ef 中执行 DbContext.Table.AddRange(Enitites).ToList() 会发生什么 昨天和朋友摸鱼,无意之间聊到了执行 DbContext.Table.AddRang ...

  2. 通用功能类:改变WinForm窗体显示颜色

    一.显示窗体调用方法 protected override void OnLoad(EventArgs e)        {            MDIClientSupport.SetBevel ...

  3. spring3+quartz2

    听说来自这里www.ydyrx.com 转载的: 最近公司要用定时任务,自己想着学习并完成任务,百度,google,360,必应,能用的搜索都用了,参差不齐,搞了一整天,也没找到一个好的例子.没办法, ...

  4. myeclipse中代码不显示SVN版本号

    打开 : windows ->preferences->General->Appearance->Lable Decoration s 勾选其中的 SVN 项即可. 如果以上方 ...

  5. Idea中修改servlet模板

    1.点击左上角的File: Setting --> Editor --> File and Code Templates --> Other --> web -->Ser ...

  6. 【转载自JHBlogs的博客】postman接口自动化,环境变量的用法详解(附postman常用的方法)

    在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要用到postma ...

  7. localStorage、sessionStorage、cookie

    vue下的全局变量和vuex里的state都是临时变量,页面刷新就都没了.

  8. 记录:Ubuntu下升级Python从2.x到3.x

    一.安装Python3 在Ubuntu中的终端输入:sudo apt-get install python3 提示资源被锁住,可能有另外一个程序在占用此资源. 解决方法:输入以下指令解锁资源 sudo ...

  9. 查看表之间的关系 需要在eas中的商业分析-扩展报表中心-报表平台下的语义层方案管理

    查看表之间的关系 需要在eas中的商业分析-扩展报表中心-报表平台下的语义层方案管理

  10. 洛谷P1012 拼数【字符串+排序】

    设有nn个正整数(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3n=3时,33个整数1313,312312,343343联接成的最大整数为:3433121334331 ...