bzoj4624: 农场种植

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 是一组用空格隔开的四

个整数组成的输出,前两个整数表示最好的建造农场的位置,接下来两个整数分别表示可以生产的谷物和牲畜的格

数。

这题可以把矩阵展开成01串S,蓝图用通配符从h*w补齐到R*C并转为带通配符的01串T

将蓝图对应的串翻转,G改为1,L改成-1,通配符改成0

此时可以发现两串的卷积代表了从每个位置开始匹配,S与T的相同字符数-不同字符数,通配符则被忽略

卷积最大且最左的合法位置即为答案

用fft优化卷积可以做到O(BRClog(RC))

#include<cstdio>
#include<cmath>
const int N0=524288;
int N,P;
const double pi=3.14159265358979323846;
struct C{
    double a,b;
    C(double x=0,double y=0):a(x),b(y){}
    C operator+(C x){return C(a+x.a,b+x.b);}
    C operator-(C x){return C(a-x.a,b-x.b);}
    C operator*(C x){return C(a*x.a-b*x.b,a*x.b+b*x.a);}
}A[N0],B[N0],tmp;
int rev[N0];
void dft(C*a,int t){
    for(int i=0;i<N;i++)if(i>rev[i])tmp=a[i],a[i]=a[rev[i]],a[rev[i]]=tmp;
    for(int i=1;i<N;i<<=1){
        C w(cos(pi/i),t*sin(pi/i));
        for(int j=0;j<N;j+=i<<1){
            C e(1),*b=a+j,*c=b+i;
            for(int k=0;k<i;k++,e=e*w){
                C x=b[k],y=e*c[k];
                b[k]=x+y;c[k]=x-y;
            }
        }
    }
    if(t==-1)for(int i=0;i<N;i++)a[i].a/=N;
}
int r,c,T,h,w;
char s[512][512],s2[512][512];
int t[N0];
void rs(char*s){
    int c=getchar();
    while(c!=‘G‘&&c!=‘L‘)c=getchar();
    while(c==‘G‘||c==‘L‘)*(s++)=c,c=getchar();
}
int main(){
    scanf("%d%d",&r,&c);
    for(int i=0;i<r;i++)rs(s[i]);
    for(N=2,P=0;N<=r*c*2+2;N<<=1,++P);
    for(int i=1;i<N;i++)rev[i]=rev[i>>1]>>1|(i&1)<<P;
    int l=r*c-1;
    scanf("%d",&T);
    for(int I=1;I<=T;I++){
        scanf("%d%d",&h,&w);
        for(int i=0;i<h;i++)rs(s2[i]);
        for(int i=0;i<r;i++)for(int j=0;j<c;j++)A[i*c+j]=C(s[i][j]==‘G‘?1:-1);
        for(int i=r*c;i<N;i++)A[i]=C();
        for(int i=0;i<N;i++)B[i]=C();
        for(int i=0;i<h;i++)for(int j=0;j<w;j++)B[l-i*c-j]=C(s2[i][j]==‘G‘?1:-1);
        dft(A,1);dft(B,1);
        for(int i=0;i<N;i++)A[i]=A[i]*B[i];
        dft(A,-1);
        for(int i=0;i<N-l;i++)t[i]=int(A[l+i].a+.5);
        int px=0,py=0,mx=0,t1=0,t2=0;
        for(int i=0;i<=r-h;i++)for(int j=0;j<=c-w;j++)if(t[i*c+j]>mx)mx=t[i*c+j],px=i,py=j;
        for(int i=0;i<h;i++)for(int j=0;j<w;j++)if(s[px+i][py+j]==s2[i][j]){
            if(s[px+i][py+j]==‘G‘)++t1;
            else ++t2;
        }
        printf("Case #%d: %d %d %d %d\n",I,px+1,py+1,t1,t2);
    }
    return 0;
}
时间: 2024-08-05 01:49:12

bzoj4624: 农场种植的相关文章

微信农场种植游戏系统开发解析

微信农场种植游戏系统开发解析(微or电 158.1500.1390 小凡团队)农场种植游戏系统开发,农场种植游戏模式开发,农场种植游戏定制开发. 一个人的成功绝非偶然,这里只为你提供一个价值平台,选择与否,全在你的把握之中,奇迹将在这里演绎,因为一种全新的财富理念在这里将被彻底解密,机会总是留给有准备的人. 模式介绍: 一,如何开地 1.新朋友注册好之后登陆账号进入"果园管理"然后在下拉菜单中选择"我的果园",再见用第一个铲子,在普通土地上铲一下,直到显示出来一棵树就好.2.会员开第二块地的方法

指尖农夫农场种植游戏开发

指尖农夫农场种植游戏开发(微or电 158.1500.1390 小凡团队)指尖农夫系统开发,指尖农夫系统开发模式,指尖农夫理财系统开发,指尖农夫系统APP开发. 在中国土地资源分散的条件下,利用互联网技术构建平台,让各种小微农场实现分布式-体化,是未来农业的必然走向.从宏观角度来看经济发展,规律性的东西是不可违背的.从所谓的农业1.0发展到现在的生态化.社会化和互联网化的4.0,符合农业产业发展的大趋势.但是,农业思维和工业思维不一样,尤其是在互联网时代,中国农业企业是被互联网"+",

果园农场种植游戏复利拆分模式app系统开发详解

330复利拆分果园游戏app系统开发(苏公子.188.1414.7927)皮皮果游戏开发,玫瑰庄园游戏开发,复利拆分游戏开发,330模式开发,330果园系统开发,复利拆分农场系统开发,英伦果开发,皮皮果游戏介绍,地点的移动.由于移动互联设备小巧的外形,它天生具有可以移动的特征,人们可以拿着它随时随地随身的查询信息.办公.娱乐.购物等,在快节奏的生活方式中,可以随时移动和携带终端设备,在公交车.地铁.火车等特殊场合也可以随时接入网络,接受信息,提高了人们的办事效率,加快信息传播的速度. 果园复利拆

农场种植游戏项目方案软件制作

苹果种树系统方案定制开发,找[王先生191+5743+0735]苹果种树分销分红软件开发=========本公司是软件开发公司,非平台方,玩家勿扰,谢谢!!!!!==== 苹果种树系统方案定制开发,找[王先生191+5743+0735]苹果种树分销分红软件开发 =========本公司是软件开发公司,非平台方,玩家勿扰,谢谢!!!!!======== 人是一个复杂的矛盾体,既有强烈发展的愿望,又有安于现状的惰性.如果没有外部压力的被逼,你要学会自逼活出新意.逼自己不断学习新知识,逼自己不断树立新

全民农场理财游戏开发

全民农场理财游戏开发 185,2946,0381 黄经理 微电同号  全民农场游戏系统 全民农场游戏app定制开发 全民农场游戏是一套寓教于乐的教育游戏,可从充满乐趣的游戏中学到众多方面的知识.在游戏中你学的越多,悟的越多,赚的越多,同时提高你对游戏果实规律的认识,对人生机会的把握,面对生活中各种机遇,做出自己正确理智的判断.花千菇游戏让你能学习基本的知识,以及如何掌控自己的个人状况,通过恰当的管理,教你如何实现财富自由,创造美好生活! 初期投入注册帐户的330元,坚持施肥50天左右准能回本.英

[bzoj]3436 小K的农场

[题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多多种植了c个单位的作物,农场a与农场b种植的作物数一样多.但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合. [输入格式] farm.in 第一行包括两个整数n和m,分别表示农场数目和小K记忆中的信息数目. 接下来m

农场游戏开发源码

农场游戏开发源码,农场游戏开发,果园游戏开发,皮皮果游戏开发,一文鸡系统开发,农场种植系统开发找王经理:139-2896-7204(微点) 果园模式,作为现在火爆的理财游戏模式,深受大家的喜爱.皮皮果.一文鸡.UU农场等相信大家都非常熟悉了.现在果园模式又添一新成员:金豆农场.金豆农场由资深理财团队合力打造,对市面上果园模式进行提炼.优化.欢迎前来体验! 随着互联网思维的爆发,很多行业都硬性将互联网思维与所处行业进行结合,而本身并没有好的设计.好的产品,纯粹靠互联网思维进行"忽悠"式营

bzoj3436: 小K的农场(差分约束)

3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1575  Solved: 690[Submit][Status][Discuss] Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多 多种植了

农场大亨游戏系统开发——大众创业,万众创新!

农场大亨游戏系统开发app开发 (苏念188.1414.7927电/微) 农场大亨游戏开发,农场大亨理财模式,农场大亨理财游戏,农场大亨模式系统开发,农场大亨种菜app,农场大亨理财平台开发,农场大亨种植游戏开发,还记得这是什么吗?当年半夜三更突然惊醒,发现自己还有菜没偷,还有宝宝们没有喂食,你是不是赶紧打开电脑,把任务完成再安心的入睡呢? 没错,QQ农牧场给我们带来了无数的欢乐和温暖,萌萌的小动物们总是那么惹人怜爱,购买并饲养小动物,每天悉心照料它们,最后你会获得金币回报,然后可以用这些金币继