【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 ...
随机推荐
- spring jdbc框架
spring+jdbc 1.jdbc编程的特点: 模板编程 固定代码+动态的参数 spring产生dataSource JdbcTemplate{//模板编程 private DataSource d ...
- 将项目从tomcat 迁移到JBoss5.0
http://java-boy.iteye.com/blog/531411从Tomcat升级到JBoss5.1真是一个痛苦的过程,可能遇到很多问题.以下是我碰到的问题,及解决方法. 一.Hiberna ...
- python selenium--常用函数1
新建实例driver = webdriver.Chrome() 1.通过标签属性Id查找元素 方法:find_element_by_id(element_id) 实例:driver.find_elem ...
- sklearn基本回归方法
https://blog.csdn.net/u010900574/article/details/52666291 博主总结和很好,方法很实用. python一些依赖库: https://www.lf ...
- Oracle Restart能够用来给Oracle GoldenGate 做 High Availability 使用么?
Oracle Restart能够用来给Oracle GoldenGate 做 High Availability 使用么? 来源于: Can Oracle Restart be used with ...
- SS不能在Win7中打开,出现停止运行
一次,在Win7上不能打开SS,经过搜索,好像SS的win客户端使用.net frame4.6.2开发,但是Win7根本安装不了该版本的.net,所以...,重新安装Win10.
- Java服务CPU占用高问题定位方法
1. 概述 提供一种简单的方法来定位CPU高的问题. 找到CPU高的进程,比如232543: 执行top -H -p pid,找到占用CPU最高的线程号,比如232544,转换成16进制38c60: ...
- c语言循环单链表
/************************************************************************* > File Name: singleLin ...
- C++11时间操作
C++11提供了chrono库,这个库可以处理和时间相关的一些事情.这个库里面主要有3个类:时间间隔Duration.时钟Clocks和时间点Time point. Duration template ...
- 新标准C++程序设计读书笔记_运算符重载
形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 class Complex { publ ...