HDU 5307 He is Flying 构造多项式+FFT
来源:互联网 发布:2017mac设置iphone铃声 编辑:程序博客网 时间:2024/06/05 21:08
题意:n个点 每个点价值为v[i],区间[l,r]的长度为r-l+1 区间价值为该区间内所有v[i]之和.
n<=1e5,v[i]累加和s<=5e4. 问区间价值为x时,这些区间长度的累加和. x=0,1,2...s.
答案:res[s[i]-s[j-1]]+=i-j+1 s[i]为前缀和i .O(n^2) TLE...
参考 S肯定也要指数,系数要体现和为S的区间的长度,则用两个前缀相减来表示
构造多项式:(∑ixsi)(∑x−si−1)−(∑xsi)(∑(i−1)x−si−1).
最后X^S的系数也就是要求的答案
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef long double ld;const int N=1e5+5,M=(1<<17)+5;const ld pi=acos(-1.0);int sum[N],rev[M];struct C{ ld real,imag; C(ld real=0,ld imag=0):real(real),imag(imag){} friend C operator +(C A,C B){ return C(A.real+B.real,A.imag+B.imag); } friend C operator -(C A,C B){ return C(A.real-B.real,A.imag-B.imag); } friend C operator *(C A,C B){ return C(A.real*B.real-A.imag*B.imag,A.imag*B.real+A.real*B.imag); }}A[M],B[M],ans[2][M];void rd(int &res){ res=0; char c; while(c=getchar(),c<48); do res=(res<<3)+(res<<1)+(c^48); while(c=getchar(),c>47);}void FFT(C *arr,int n,int flag){ for(int i=0;i<n;++i) if(i<rev[i]) swap(arr[i],arr[rev[i]]); for(int m=2;m<=n;m<<=1){ C wm(cos(2*pi/m),flag*sin(2*pi/m)); for(int i=0;i<n;i+=m){ C w(1,0); for(int j=0;j<m>>1;++j,w=w*wm){ C x=arr[i+j],y=w*arr[i+j+(m>>1)]; arr[i+j]=x+y; arr[i+j+(m>>1)]=x-y; } } }}void calc_FFT(int n,bool id){ int _n=n,m=n<<1,S=0; for(n=1;n<=m;n<<=1,++S); rev[0]=0; for(int i=1;i<n;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(S-1)); for(int i=_n+1;i<n;++i) A[i]=B[i]=0; FFT(A,n,1); FFT(B,n,1); for(int i=0;i<n;++i) ans[id][i]=A[i]*B[i]; FFT(ans[id],n,-1); for(int i=0;i<=m;++i) ans[id][i].real/=n;}void solve(){ll ans0=0;int n;scanf("%d",&n);sum[0]=0;for(int i=1,v,cnt=0;i<=n;i++){scanf("%d",&v),sum[i]=sum[i-1]+v;if(v==0){++cnt;ans0+=1ll*cnt*(cnt+1)/2;}elsecnt=0;}printf("%I64d\n",ans0);for(int i=0;i<=sum[n];i++)A[i]=B[i]=0;for(int i=1;i<=n;i++){A[sum[i]].real+=i;B[-sum[i-1]+sum[n]].real+=1;//¸ºÏµÊýÀëÉ¢»¯ }calc_FFT(sum[n],0);for(int i=0;i<=sum[n];++i) A[i]=B[i]=0; for(int i=1;i<=n;++i){ A[sum[i]].real+=1; B[-sum[i-1]+sum[n]].real+=i-1; } calc_FFT(sum[n],1);//1 id for(int i=1;i<=sum[n];i++) printf("%I64d\n",(ll)(ans[0][i+sum[n]].real-ans[1][i+sum[n]].real+0.5));}int main(){int T;cin>>T;while(T--)solve();return 0;}
构造多项式:(∑ixsi)(∑x−si−1)−(∑xsi)(∑(i−1)x−si−1).
阅读全文
0 0
- HDU 5307 He is Flying 构造多项式+FFT
- HDU 5307 He is Flying【FFT】
- hdu 5307 He is Flying [FFT]
- hdu 5307 He is Flying
- hdu 5307 He is Flying
- hdu5307 He is Flying FFT
- [FFT] [HDU5307] He is Flying
- 【HDU】5307 He is Flying【分别统计+NTT】
- HDU5307 He is Flying
- hdu 5307 He is Flying 2015 Multi-University Training Contest 2 快速傅里叶变换
- 多校第二场1008 He is flying
- Hdu 5307 He is Fly 2015ACM多校对抗赛第二场
- HDU 4609 3-idiots(多项式计数 + FFT卷积优化)
- FFT uoj34 多项式乘法
- FFT与多项式乘法
- FFT uoj34 多项式乘法
- [bzoj3527]&[caioj1451][FFT]多项式
- 【Luogu3808】多项式乘法FFT
- C语言数据结构应用(图书借阅系统)
- 【C++】模板总结
- Swift 负数转二进制
- 网上商城项目案例
- SQL Server Merge语句的使用
- HDU 5307 He is Flying 构造多项式+FFT
- 1049. 数列的片段和
- 1050. 螺旋矩阵
- python笔记
- centos7 配置samba共享服务
- apache tomcat集群
- 皮尔逊相关系数
- JavaScript--解析JSon数据--JS对象、数组
- 【BigHereo 13】-----Constant Grow