4624: 农场种植

Time Limit: 50 Sec  Memory Limit: 512 MB
Submit: 48  Solved: 31
[Submit][Status][Discuss]

Description

农夫约翰想要在一片巨大的土地上建造一个新的农场。 这块土地被抽象为个 R*C 的矩阵。土地中的每个方格都可
以用来生产一种食物:谷物(G)或者是牲畜(L)。下面是一个 R 为 5,C 为 8 的土地的样例:
  12345678
1 GLGGLGLG
2 GGLGGLGL
3 GGLLLGGG
4 LLGLLGLG
5 LGGGLGLL
农夫约翰已经有一套设计好的他想要建造的农场的蓝图。 每一个蓝图被抽象为一个 H*W 的矩阵,其中 H≤R,W≤
C。蓝图中的每个方格表示着农夫约翰想要生产的食物,谷物(G)或是牲畜(L)。下面是一个 H=2,W=3 的蓝图的样
例。
  123
1 GLL
2 LGG
使用这个蓝图,农夫约翰可以在土地上的某个位置建立起实际的农场。这个农场的位置可以用它的左上角的位置来
代表, 比如这个农场被建立在土地上的(r,c)这个位置,这个农场必须整个都建立在这块土地中(也就是说 r + H
 ≤ R 并且 c + W ≤ C) 。如果在土地上的位置(r + i, c + j)的食物种类和蓝图里的位置(i + 1, j + 1)的食
物种类相同(其中 0 ≤ i<H,0 ≤ j<W) ,那么就能出产食物。农夫约翰想要找到这样的农场位置,使得他可以
出产最多的食物(即谷物的格数+牲畜的格数) 。如果有多于一个可能的解,输出最上方的一个,如果仍然有多于
一个可能的解,就输出最作坊的一个。比如对于上面给出的土地和蓝图的样例,最佳的农场位置是(1, 3),这是最
左上方的一个可行的农场,如下图所示:
  12345678
1 GLGGLGLG
2 GGLGGLGL
3 GGLLLGGG
4 LLGLLGLG
5 LGGGLGLL
通过在(1, 3)位置建立农场,农夫约翰可以生产出 5 格的粮食,3 格谷物和2 格牲畜,具体来说,是第一行的一
格谷物和一个牲畜,第二行的一格牲畜和两格谷物。注意位置(2, 5)和位置(3, 2)同样能生产出 5 格谷物,但是
农夫约翰需要的是最靠上中的最靠左的。 在除此以外的任何位置放置农场都只能生产出少于5 格的食物。
 

Input

输入数据中只有一组土地,第一行包含了两个整数 R 和 C,其中 0 <R,C ≤500,紧接着是 R 行每行包含 C 个字
符来描述这片土地,接下来有一个整数 B,满足 0 <B ≤ 5,表示农夫约翰拥有的蓝图的数量,接下来是 B 个蓝
图,每个蓝图都以包含两个整数 H 和 W 的一行开头,其中 0 <H ≤ R 并且 0 <W ≤ C,紧接着是 H 行,每行 W
 个字母来描述这个蓝图。对于每个蓝图,在一行中输出"Case #X: Y"(没有引号) ,X 是蓝图编号,从 1 开始
,Y 是一组用空格隔开的四个整数组成的输出,前两个整数表示最好的建造农场的位置,接下来两个整数分别表示
可以生产的谷物和牲畜的格数。
R,C ≤ 500,B≤5,H≤R,W≤C
 

Output

对于每个蓝图,在一行中输出"Case #X: Y"(没有引号) ,X 是蓝图编号,从 1 开始,Y 是一组用空格隔开的四
个整数组成的输出,前两个整数表示最好的建造农场的位置,接下来两个整数分别表示可以生产的谷物和牲畜的格
数。
 

Sample Input

5 8
GLGGLGLG
GGLGGLGL
GGLLLGGG
LLGLLGLG
LGGGLGLL
3 2
3
GLL
LGG
3 1
L G G 1
4
GGLL

Sample Output

Case #1: 1 3 3 2
Case #2: 1 2 2 1
Case #3: 3 1 2 2

HINT

 

题解:

  矩阵的对应位置相乘的方法:将两个矩阵都暴力展开成一维的,第二个矩阵的空余位置补0,然后直接FFT即可。 

  先将G看成0,F看成1,再将F看成0,G看成1,做两次FFT,这样就能统计出每个位置的答案了。

    其实和一维是差不多的,只不过二维的话有点需要确定的就是,必须将小矩阵补充到大矩阵,这个很关键。

 #include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio> #define pi acos(-1)
#define N 600007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int R,C,H,W,num,L;
int rev[N],a[][],b[][];
struct comp
{
double r,v;
comp(){r=v=0.0;}
comp(double x,double y){r=x,v=y;}
void init(){r=v=0.0;}
friend inline comp operator+(comp x,comp y){return comp(x.r+y.r,x.v+y.v);}
friend inline comp operator-(comp x,comp y){return comp(x.r-y.r,x.v-y.v);}
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);}
friend inline comp operator/(comp x,int y){return comp(x.r/y,x.v/y);}
}a1[N],b1[N],a2[N],b2[N],c[N];
char ch[],T[][]; void FFT(comp *a,int flag)
{
for (int i=;i<num;i++)
if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=;i<num;i<<=)
{
comp wn=comp(cos(pi/i),flag*sin(pi/i));
for (int j=;j<num;j+=(i<<))
{
comp w=comp(,);
for (int k=;k<i;k++,w=w*wn)
{
comp x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
if (flag==-) for (int i=;i<num;i++) a[i].r=a[i].r/num;
}
int main()
{
R=read(),C=read();
for (int i=;i<R;i++)
{
scanf("%s",ch);
for (int j=;j<C;j++)
{
if (ch[j]=='G') a1[i*C+j]=comp(,);
else b1[i*C+j]=comp(,);
}
}
for (num=;num<=R*C*;num<<=,L++);if (L) L--;
for (int i=;i<num;i++) rev[i]=(rev[i>>]>>)|((i&)<<L);
FFT(a1,),FFT(b1,);
int Total=read();
for (int Case=;Case<=Total;Case++)
{
H=read(),W=read(),memset(a,,sizeof(a)),memset(b,,sizeof(b));
for (int i=;i<num;i++)
a2[i].init(),b2[i].init();
for (int i=;i<H;i++)
scanf("%s",T[i]);
for (int i=;i<H;i++)
for (int j=;j<W;j++)
if (T[i][j]=='G') a2[R*C--i*C-j]=comp(,);
else b2[R*C--i*C-j]=comp(,);
FFT(a2,),FFT(b2,);
for (int i=;i<num;i++)
a2[i]=a1[i]*a2[i],b2[i]=b1[i]*b2[i];
FFT(a2,-),FFT(b2,-);
for (int i=;i<R-H;i++)
for (int j=;j<C-W;j++)
a[i][j]=(int)(a2[i*C+j+R*C-].r+0.5),
b[i][j]=(int)(b2[i*C+j+R*C-].r+0.5);
int x,y;x=y=;
for (int i=;i<R-H;i++)
for (int j=;j<=C-W;j++)
if (a[i][j]+b[i][j]>a[x][y]+b[x][y]) x=i,y=j;
printf("Case #%d: %d %d %d %d\n",Case,x+,y+,a[x][y],b[x][y]);
}
}

最新文章

  1. T-SQL 基础学习 04
  2. Javascript学习笔记:闭包题解(3)
  3. Nancy FormsAuthentication使用
  4. ajax简单封装
  5. tableview 重用nib cell
  6. 让 zend studio 识别 Phalcon语法并且进行语法提示
  7. 【Java探索道路安全系列:Java可扩展的安全架构】一间:Java可扩展的安全体系结构开始
  8. 3.1 Data Member的绑定
  9. C语言中关键字restrict的概念,使用范围,例子
  10. 福州大学软件工程1816 | W班 团队Alpha阶段成绩汇总排名(第9、10次作业)
  11. pjax转发
  12. xcode 编译或者打包的时候 找不到图片的错误
  13. MySQL Processlist--常见线程状态
  14. form表单序列化为json格式数据
  15. Just Another Problem UVA - 11490(枚举)
  16. 【转】WCF服务的创建和发布到IIS
  17. python技巧总结之set、日志、rsa加密
  18. IOS-组件化架构漫谈
  19. C# WebApi 过滤器的使用开发接口必备利器
  20. MongoDB - MongoDB CRUD Operations, Query Documents, Iterate a Cursor in the mongo Shell

热门文章

  1. uva 253 - Cube painting(相同骰子)
  2. Blah数集
  3. Java——自动生成30道四则运算---18.09.27
  4. The Road to learn React书籍学习笔记(第四章)
  5. OBS源码编译开发
  6. ES6 中 export ,export default 区别
  7. 名字管理系统demo
  8. Selenium LoadableComponent加载组件
  9. 第一篇 Charles的配置及相关使用
  10. VS2010历史记录清理