bzoj 4624 农场种植 fft
4624: 农场种植
Time Limit: 50 Sec Memory Limit: 512 MB
Submit: 48 Solved: 31
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
GLGGLGLG
GGLGGLGL
GGLLLGGG
LLGLLGLG
LGGGLGLL
3 2
3
GLL
LGG
3 1
L G G 1
4
GGLL
Sample Output
Case #2: 1 2 2 1
Case #3: 3 1 2 2
HINT
题解:
矩阵的对应位置相乘的方法:将两个矩阵都暴力展开成一维的,第二个矩阵的空余位置补0,然后直接FFT即可。
先将G看成0,F看成1,再将F看成0,G看成1,做两次FFT,这样就能统计出每个位置的答案了。
其实和一维是差不多的,只不过二维的话有点需要确定的就是,必须将小矩阵补充到大矩阵,这个很关键。
1 #include<cstring> 2 #include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdio> 6 7 #define pi acos(-1) 8 #define N 600007 9 using namespace std; 10 inline int read() 11 { 12 int x=0,f=1;char ch=getchar(); 13 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 14 while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 18 int R,C,H,W,num,L; 19 int rev[N],a[507][507],b[507][507]; 20 struct comp 21 { 22 double r,v; 23 comp(){r=v=0.0;} 24 comp(double x,double y){r=x,v=y;} 25 void init(){r=v=0.0;} 26 friend inline comp operator+(comp x,comp y){return comp(x.r+y.r,x.v+y.v);} 27 friend inline comp operator-(comp x,comp y){return comp(x.r-y.r,x.v-y.v);} 28 friend inline comp operator*(comp x,comp y){return comp(x.r*y.r-x.v*y.v,x.r*y.v+x.v*y.r);} 29 friend inline comp operator/(comp x,int y){return comp(x.r/y,x.v/y);} 30 }a1[N],b1[N],a2[N],b2[N],c[N]; 31 char ch[507],T[507][507]; 32 33 void FFT(comp *a,int flag) 34 { 35 for (int i=0;i<num;i++) 36 if (i<rev[i]) swap(a[i],a[rev[i]]); 37 for (int i=1;i<num;i<<=1) 38 { 39 comp wn=comp(cos(pi/i),flag*sin(pi/i)); 40 for (int j=0;j<num;j+=(i<<1)) 41 { 42 comp w=comp(1,0); 43 for (int k=0;k<i;k++,w=w*wn) 44 { 45 comp x=a[j+k],y=w*a[j+k+i]; 46 a[j+k]=x+y,a[j+k+i]=x-y; 47 } 48 } 49 } 50 if (flag==-1) for (int i=0;i<num;i++) a[i].r=a[i].r/num; 51 } 52 int main() 53 { 54 R=read(),C=read(); 55 for (int i=0;i<R;i++) 56 { 57 scanf("%s",ch); 58 for (int j=0;j<C;j++) 59 { 60 if (ch[j]=='G') a1[i*C+j]=comp(1,0); 61 else b1[i*C+j]=comp(1,0); 62 } 63 } 64 for (num=1;num<=R*C*2;num<<=1,L++);if (L) L--; 65 for (int i=0;i<num;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<L); 66 FFT(a1,1),FFT(b1,1); 67 int Total=read(); 68 for (int Case=1;Case<=Total;Case++) 69 { 70 H=read(),W=read(),memset(a,0,sizeof(a)),memset(b,0,sizeof(b)); 71 for (int i=0;i<num;i++) 72 a2[i].init(),b2[i].init(); 73 for (int i=0;i<H;i++) 74 scanf("%s",T[i]); 75 for (int i=0;i<H;i++) 76 for (int j=0;j<W;j++) 77 if (T[i][j]=='G') a2[R*C-1-i*C-j]=comp(1,0); 78 else b2[R*C-1-i*C-j]=comp(1,0); 79 FFT(a2,1),FFT(b2,1); 80 for (int i=0;i<num;i++) 81 a2[i]=a1[i]*a2[i],b2[i]=b1[i]*b2[i]; 82 FFT(a2,-1),FFT(b2,-1); 83 for (int i=0;i<R-H;i++) 84 for (int j=0;j<C-W;j++) 85 a[i][j]=(int)(a2[i*C+j+R*C-1].r+0.5), 86 b[i][j]=(int)(b2[i*C+j+R*C-1].r+0.5); 87 int x,y;x=y=0; 88 for (int i=0;i<R-H;i++) 89 for (int j=0;j<=C-W;j++) 90 if (a[i][j]+b[i][j]>a[x][y]+b[x][y]) x=i,y=j; 91 printf("Case #%d: %d %d %d %d\n",Case,x+1,y+1,a[x][y],b[x][y]); 92 } 93 }
转载于:https://www.cnblogs.com/fengzhiyuan/p/8682485.html
bzoj 4624 农场种植 fft相关推荐
- bzoj 3513: [MUTC2013]idiots FFT
bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...
- 农场种植游戏(源码+数据库+文档)
农场游戏源码 种植养殖果园吸粉理财 农场源码 淘金农场 复利拆分 分红源码. 个人收益:先升级农场!在升级果树果树每天都可以产生鲜果!每天产生的都是你的个人收益!果树等级越高,团队,直推,收益也越高! ...
- 果园游戏农场种植游戏小程序APP
本游戏是一款休闲娱乐种植游戏,可集成在商城系统里面做积分引流,以供用户娱乐,也可以APP对接广告联盟,从而使运营者获得相应广告收益. 功能介绍 1.土地:农场土地共分为12块,新用户默认1块.每块土地 ...
- BZOJ.3527.[ZJOI2014]力(FFT)
题目链接 \(Descripiton\) 给出\(q[\ ]\),\[F[j]=\sum_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum_{i>j}\frac{q_iq_ ...
- BZOJ 4827 [Hnoi2017]礼物 ——FFT
题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...
- BZOJ 3513: [MUTC2013]idiots [FFT]
统计每种长度的木棒数量,先计算出两根棒子能构成的长度,想到卷积.1.拿这个序列卷积自己 2.计算重算的部分,首先是一条边自己和自己的这种情况,另一种是(i,j)和(j,i)这种形式.第一种,可以枚举读 ...
- bzoj 4827 [Hnoi2017]礼物——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...
- bzoj 3527 [Zjoi2014]力——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 把 q[ i ] 除掉.设 g[ i ] = i^2 ,有一半的式子就变成卷积了:另一 ...
- 小鸡农场种植小游戏开发
农夫拘鸡是一款有趣行性的动作小游戏,农场里的小鸡长大后会飞,它们试图逃离现场,农场主要防止小鸡飞走.游戏操作简单,玩家通过重力感应控制农夫移动的跳跃的方向,把飞走的小鸡踹下来,踩在地上. 农夫穿了那件 ...
最新文章
- 处女座和小姐姐(三)
- linux获取read值,read命令读取用户输入
- Android访问网络系列之--访问图片
- Qt经验积累:常见的驱动打包处理方法
- 免费福利 | 送你一份免费音频,让你躺着也能学习葡萄酒知识!
- c语言单链表原地转置,不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作...
- c++函数可变参数的使用
- c语言指向指针的指针
- 力荐收藏:新QC七大工具(完整版)
- MATLAB疲劳检测系统
- win10如何设置锁屏后不熄屏
- 由两个重要极限推导常见等价无穷小以及常见导数公式
- MaxProxy代理可以替代911s5代理吗?还有哪些软件可以使用
- 猿人学web端爬虫攻防大赛赛题解析_第一题:源码乱码
- 如何手机访问电脑服务器上的网页?
- 从 HTTP 瞎逼逼到 HTTP/2
- 是否还被word中各种下划线、波浪线困扰,来看这里(Word中拼写语法错误)
- LINUX学记笔记17
- 广州市天河区2021-2022学年九年级第一学期期末考试英语试题
- C语言之洛谷刷题之路---顺序结构