记录编号 362896 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [HZOI 2015]无聊的会议V2 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 34.326 s
提交时间 2017-01-09 13:59:20 内存使用 59.03 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. typedef double db;
  6. const int N=1.1e6+10;
  7. const db pi=acos(-1.0);
  8. #define rint register int
  9. int n,size,a[N],ans[N];
  10. bool vis[5];
  11. struct comp{
  12. db x,y;
  13. comp(db X=0,db Y=0){x=X;y=Y;}
  14. comp operator + (const comp a)const{return comp(x+a.x,y+a.y);}
  15. comp operator - (const comp a)const{return comp(x-a.x,y-a.y);}
  16. comp operator * (const comp a)const{return comp(x*a.x-y*a.y,x*a.y+y*a.x);}
  17. }w[N],x[N],tmp[N];
  18. void fft(comp *a,int n,int start,int step){
  19. if (n==1) return;
  20. rint m=n>>1;
  21. fft(a,m,start,step<<1);
  22. fft(a,m,start+step,step<<1);
  23. for (rint i=0,pos;i<m;++i){
  24. pos=2*i*step;
  25. tmp[i]=a[start+pos]+w[i*step]*a[start+pos+step];
  26. tmp[i+m]=a[start+pos]-w[i*step]*a[start+pos+step];
  27. }
  28. for (rint i=0,p=start;i<n;++i,p+=step) a[p]=tmp[i];
  29. }
  30. void solve(int flag){
  31. for (int i=0;i<size;i++)
  32. x[i].y=0,x[i].x=(a[i]==flag);
  33. fft(x,size,0,1);
  34. for (int i=0;i<size;i++) x[i]=x[i]*x[i];
  35. reverse(w,w+size+1);
  36. fft(x,size,0,1);
  37. for (int i=0;i<size;i++){
  38. x[i].x/=size;
  39. if (!(i&1)&&a[i/2]==flag)
  40. ans[i>>1]+=int(x[i].x+0.5)>>1;
  41. }
  42. reverse(w,w+size+1);
  43. }
  44. int main()
  45. {
  46. freopen("OXO.in","r",stdin);
  47. freopen("OXO.out","w",stdout);
  48. scanf("%d",&n);
  49. for (int i=0;i<n;i++)
  50. scanf("%d",&a[i]),vis[a[i]]=1;
  51. for (size=1;size<n*2;size<<=1);
  52. for (int i=n;i<size;i++) a[i]=-1;
  53. w[0]=comp(1,0);
  54. w[1]=comp(cos(2*pi/size),sin(2*pi/size));
  55. for (int i=2;i<=size;i++)
  56. w[i]=w[i-1]*w[1];
  57. for (int x=0;x<5;x++)
  58. if (vis[x]) solve(x);
  59. for (int i=0;i<n;i++)
  60. printf("%d\n",ans[i]);
  61. return 0;
  62. }