BZOJ 3509 分块FFT
思路:
跟今年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的更多相关文章
- [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)
[BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...
- [BZOJ 3771] Triple(FFT+容斥原理+生成函数)
[BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...
- BZOJ 3509 [CodeChef] COUNTARI ——分块 FFT
分块大法好. 块内暴力,块外FFT. 弃疗了,抄SX队长$silvernebula$的代码 #include <map> #include <cmath> #include & ...
- bzoj 3509: [CodeChef] COUNTARI] [分块 生成函数]
3509: [CodeChef] COUNTARI 题意:统计满足\(i<j<k, 2*a[j] = a[i] + a[k]\)的个数 \(2*a[j]\)不太好处理,暴力fft不如直接暴 ...
- BZOJ 3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 883 Solved: 250[Submit][S ...
- CC countari & 分块+FFT
题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
- CodeChef COUNTARI Arithmetic Progressions(分块 + FFT)
题目 Source http://vjudge.net/problem/142058 Description Given N integers A1, A2, …. AN, Dexter wants ...
- 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶
第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度 ...
- 【做题】codechefCOUNTARI——分块FFT
记本题数组长度为\(n\),权值大小为\(m\). 首先,暴力显然是\(O(n^2)\)的. 先瞄一眼tag,然后发现这是FFT. 显然,问题的关键在于要满足i,j,k之间的位置关系.于是考虑分治FF ...
随机推荐
- Python语言之常用函数
1.input(),raw_input() input() = eval( raw_input() ) 其中raw_input()将所有的输入当做字符串处理. eval(str [,globals [ ...
- Python3爬虫----爬取网页内的图片
无聊把公司内网爬了一遍. https://github.com/gig886/Python/tree/master/爬虫
- MFC 添加文件路径 遍历文件
.添加MFC选择文件路径,使用MessageBox显示信息. void CMyCalLawsDlg::OnBnClickedAddfolder() { wchar_t* p; wchar_t szPa ...
- HDU_1398_母函数
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- day34-2 类和对象(重点)
目录 类 定义类和对象 __dict__ 和__class__ 创建对象时的底层运作 定义对象独有的特征 init __slots__(了解) 给对象添加属性时的底层运作 类 分类/类别 上述的代码( ...
- 使用VirtualBox实现端口转发,以SSH与Django为例
先来认识几个概念 (1)IP地址:又称为互联网协议地址,是计算机的物理地址,相当于计算机的编号,是32位的二进制数,通常被分割成4个8位的二进制数: (2)端口:指设备与外界通讯的接口,一台计算机的端 ...
- Java基础学习总结(39)——Log4j 1使用教程
1. 配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.rootLogger = [ level ] , appenderName1 , appenderN ...
- Linux查看 kennel , 物理CPU个数、核数、逻辑CPU个数
other article on my list: 查看进程 https://i.cnblogs.com/PostDone.aspx?postid=9231604&actiontip=%E4% ...
- Java上使用Lombok插件简化Getter、Setter方法
Maven引入依赖: <dependencies> <dependency> <groupId>org.projectlombok</groupId> ...
- 【微信小程序】:小程序,新场景
前言: 我们频繁进入的地方,是场景. 手机.是场景:浏览器.是场景.事实上,微信,也是场景-- 微信要做的是占领很多其它用户时间.占领很多其它应用场景.占领很多其它服务入口.这是商业本质想去垄断要做的 ...