【BZOJ4624】农场种植 FFT
【BZOJ4624】农场种植
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
题解:Get了套路,矩阵的对应位置相乘的方法:将两个矩阵都暴力展开成一维的,第二个矩阵的空余位置补0,然后直接FFT即可。
对于本题,我们可以沿用万径人踪灭的做法,先将G看成0,F看成1,再将F看成0,G看成1,做两次FFT,这样就能统计出每个位置的答案了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#define pi acos(-1.0)
using namespace std;
int H,W,R,C,len,cas,CAS,x,y;
char S[510][510],T[510][510];
int a1[510][510],a2[510][510];
struct cp
{
double x,y;
cp () {}
cp (double a,double b) {x=a,y=b;}
cp operator + (const cp &a) const {return cp(x+a.x,y+a.y);}
cp operator - (const cp &a) const {return cp(x-a.x,y-a.y);}
cp operator * (const cp &a) const {return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
}l1[600000],l2[600000],l3[600000];
void FFT(cp *a,int f)
{
int i,j,k,h;
cp t;
for(i=k=0;i<len;i++)
{
if(i>k) swap(a[i],a[k]);
for(j=(len>>1);(k^=j)<j;j>>=1);
}
for(h=2;h<=len;h<<=1)
{
cp wn(cos(f*2*pi/h),sin(f*2*pi/h));
for(j=0;j<len;j+=h)
{
cp w(1.0,0);
for(k=j;k<j+h/2;k++) t=w*a[k+h/2],a[k+h/2]=a[k]-t,a[k]=a[k]+t,w=w*wn;
}
}
if(f==-1) for(i=0;i<len;i++) a[i].x=a[i].x/len;
}
int main()
{
scanf("%d%d",&R,&C);
int i,j;
for(i=0;i<R;i++)
{
scanf("%s",S[i]);
for(j=0;j<C;j++)
{
if(S[i][j]=='G') l1[i*C+j]=cp(1,0);
else l2[i*C+j]=cp(1,0);
}
}
for(len=1;len<(R*C)*2+5;len<<=1);
FFT(l1,1),FFT(l2,1);
scanf("%d",&cas);
for(CAS=1;CAS<=cas;CAS++)
{
scanf("%d%d",&H,&W);
memset(a1,0,sizeof(a1)),memset(a2,0,sizeof(a2));
for(i=0;i<H;i++) scanf("%s",T[i]);
memset(l3,0,sizeof(l3[0])*(len+10));
for(i=0;i<H;i++) for(j=0;j<W;j++) if(T[i][j]=='G') l3[R*C-1-i*C-j]=cp(1,0);
FFT(l3,1);
for(i=0;i<len;i++) l3[i]=l3[i]*l1[i];
FFT(l3,-1);
for(i=0;i<=R-H;i++) for(j=0;j<=C-W;j++) a1[i][j]=int(l3[i*C+j+R*C-1].x+0.5);
memset(l3,0,sizeof(l3[0])*(len+10));
for(i=0;i<H;i++) for(j=0;j<W;j++) if(T[i][j]=='L') l3[R*C-1-i*C-j]=cp(1,0);
FFT(l3,1);
for(i=0;i<len;i++) l3[i]=l3[i]*l2[i];
FFT(l3,-1);
for(i=0;i<=R-H;i++) for(j=0;j<=C-W;j++) a2[i][j]=int(l3[i*C+j+R*C-1].x+0.5);
x=y=0;
for(i=0;i<=R-H;i++) for(j=0;j<=C-W;j++) if(a1[i][j]+a2[i][j]>a1[x][y]+a2[x][y]) x=i,y=j;
printf("Case #%d: %d %d %d %d\n",CAS,x+1,y+1,a1[x][y],a2[x][y]);
}
return 0;
}//5 8 GLGGLGLG GGLGGLGL GGLLLGGG LLGLLGLG LGGGLGLL 3 2 3 GLL LGG 3 1 L G G 1 4 GGLL
【BZOJ4624】农场种植 FFT的更多相关文章
- bzoj 4624 农场种植 fft
4624: 农场种植 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 48 Solved: 31[Submit][Status][Discuss] D ...
- BZOJ4624 : 农场种植
设$A[i][j]=[a[i][j]=G],B[i][j]=[b[i][j]=L]$,枚举右下角,则对应$(A-B)^2$的和就是匹配成功的格子数. $(a-b)^2=a^2+b^2-2ab$,将矩阵 ...
- 【BZOJ】3436: 小K的农场
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 938 Solved: 417[Submit][Status][Discuss ...
- BZOJ3436 小K的农场
Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个 ...
- 2014.7.7 模拟赛【小K的农场】
3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...
- BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2111 Solved: 986[Submit][Status][Discus ...
- 【BZOJ3436】小K的农场 差分约束
[BZOJ3436]小K的农场 Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了, ...
- [bzoj]3436 小K的农场
[题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的 ...
- bzoj3436: 小K的农场(差分约束)
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1575 Solved: 690[Submit][Status][Discus ...
随机推荐
- OGNL表达式语言网上转来的
1.概念:OGNL是ObjectGraphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言. 2.功能: ...
- flashback database(drop tablespace)
1.首先记录时间 select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') from dual;--2014-04-25 13:55:48 查看表sel ...
- 360极速浏览器无法正确getHours
开发了一个显示时间的功能. 功能是这样的,首先从数据库中读取时间,然后显示到前端页面上. 数据库中:2017-08-10 14:25:35.867 前端显示:2017-08-10T14:25:35.8 ...
- python导入模块的两种方式
第一种 from support import * 这种方式导入后可以直接调用(有命名冲突问题)命名冲突后定义的覆盖前定义的 如果在函数导入前定义 则导入函数覆盖 否则相反 if __name__ = ...
- C#指南,重温基础,展望远方!(2)程序结构
C# 中的关键组织结构概念包括程序.命名空间.类型.成员和程序集. C# 程序由一个或多个源文件组成. 程序声明类型,而类型则包含成员,并被整理到命名空间中. 类型示例包括类和接口. 成员示例包括字段 ...
- AAAA block
[self AAAA:^(BOOL isSuccessed, id userInfo, NSString *errorMsg) { NSLog(@"AAAA: %d, userInfo: % ...
- atitit.系统托盘图标的设计java swing c# .net c++ js
atitit.系统托盘图标的实现java swing c# .net c++ js 1. 系统托盘图标的结构 1 2. Java swing的实现 1 3. .net的实现 1 4. C++的实现 1 ...
- 深入浅出FPGA-2-让source insight 支持verilog HDL
引言 工欲善其事,必先利其器.最近用verilog在FPGA上做一个简易的计算器,整个工程由6个模块组成,之前写的代码都是很小的,模块也很少,一般就一两个,没感觉出别扭.但是模块多了就发现,模块之间的 ...
- Javascript网页截屏的方法
最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...
- AxureRP_for_chorme的安装和使用方法
1.下载AxureRP_for_chorme_version.crx 2.打开Chrome,右上角菜单图标->更多->扩展程序 3.将crx文件拖入,安装 4.选中AxureRP的“已启用 ...