前缀和zzuoj10445 魔法花园

身为魔法少女的一员,学姐(头还在哦)在最后一战之后便退隐了。她决定用她剩余的魔法去圈一块矩形花园。但是有一些土地会使学姐的魔法失效(即边不可以跨越这些土地)。现在学姐想知道在这块N*M的土地上她可以获得的最大花园面积。(单位格面积为1).在这块N*M的图中,”.”表示学姐可以施法,”X”表示会失效。(1<=N,M<=200)。

Input

输入为多组样例,第一行为N和M,下面N*M描述这个土地。

Output

输出多行,每行为麻美学姐可以获得的最大花园面积。

Sample Input

5 6 ...... ..X..X X..X.. ...... ..X... 

Sample Output

16 

HINT

如上样例,假设麻美学姐的魔法为F,那么她圈地的方式是

.FFFF.

.FX.FX

XF.XF.

.FFFF.

..X...

 思路:

先把数据转换成01矩阵,然后维护每一行的前缀和。接下来就可以用O(1)的时间复杂度查询一段数组的和。若一段数组的和为0,则没有X,否则就有X。

枚举矩形的左右两列,然后开始搜索矩形的上下两行。在行向下滑动的过程用一个值维护矩形的上边的行号。若找到一个全0行,先判断是否已经存在一个合法的矩形的上边,若不存在则用该全0行的行号更新上边的行号,若存在上边,则该行为矩形的下边,这时就得到了一个合法的矩形,计算面积后去更新最大面积的值。

#include<stdio.h>

#define NOT_EXIST -1
int map[204][204];
void initial_matrix(int n,int m){
        getchar();
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j){
                if(getchar()==‘.‘) map[i][j]=0;
                else map[i][j]=1;
                if(j>0) map[i][j]+=map[i][j-1];
            }
            getchar();
        }
    //    for(int i=0;i<n;++i){
//            for(int j=0;j<m;++j){
//                printf("%d",map[i][j]);
//            }
//            printf("\n");
//        }
}
inline bool zero_point(int row,int col){
    if(col-1<0&&(map[row][col]==0)) return true;
    else if(col-1>=0&&(map[row][col]-map[row][col-1]==0)) return true;
    else return false;
}
inline bool blank_line(int row,int col_left,int col_right){
    if(col_left-1<0&&(map[row][col_right]==0)) return true;
    else if(col_left-1>=0&&(map[row][col_right]-map[row][col_left-1]==0)) return true;
    else return false;
}
void open(){
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout); 
}

int main(int argc,char **argv){
    int n,m;
//    open();
    while(scanf("%d%d",&n,&m)!=EOF){
        initial_matrix(n,m);
        int rectangle_top_edge;
        int max_area=0;
        for(int col_left=0;col_left<m;++col_left){
                for(int col_right=col_left; col_right < m; ++col_right){
                        rectangle_top_edge=NOT_EXIST;
                        for(int row=0;row < n; ++row){
                    //        printf("row=%d col_left%d:%d col_right%d:%d\n",row,col_left,zero_point(row,col_left),col_right,zero_point(row,col_right));
                            if(zero_point(row,col_left) && zero_point(row,col_right)){
                                if(blank_line(row,col_left,col_right)){
                                    if(rectangle_top_edge==NOT_EXIST){
                                        rectangle_top_edge=row;
                                        if(col_right-col_left+1 > max_area) {
                                            max_area=col_right-col_left+1; 
                        //                    printf("rectangle_top_edge=%d row=%d col_left=%d col_right=%d max_area=%d\n",rectangle_top_edge,row,col_left,col_right,max_area);                                        
                                        }
                                    }else {
                                        if((row-rectangle_top_edge+1)*(col_right-col_left+1)>max_area){
                                            max_area= (row-rectangle_top_edge+1)*(col_right-col_left+1);
                        //                    printf("rectangle_top_edge=%d row=%d col_left=%d col_right=%d max_area=%d\n",rectangle_top_edge,row,col_left,col_right,max_area);
                                        }
                                    }
                                }
                            }else{
                                rectangle_top_edge=NOT_EXIST;
                            }
                        }
                }
        }
        printf("%d\n",max_area);
    }
    return 0;
}

时间: 2024-10-12 01:04:23

前缀和zzuoj10445 魔法花园的相关文章

转:Elasticsearch TermQuery 详解

JavaClient 查询ES QueryBuilder queryBuilder = QueryBuilders.termQuery("字段","term值"); SearchResponse response = client.prepareSearch("索引名称") .setTypes("type名称") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery

Unity3D手游开发实践

<腾讯桌球:客户端总结> 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: 架构设计 原生插件/平台交互 版本与补丁 用脚本,还是不用?这是一个问题 资源管理 性能优化 异常与Crash 适配与兼容 调试及开发工具 项目运营 ? 1.架构设计 好的架构利用大规模项目的多人团队开发和代码管理,也利用查找错误和后期维护. 框架的选择:需要根据团队.项目来进行选择,没有最好的框架,只有最合适的框架. 框架的使

Elasticsearch TermQuery 详解

官方文档地址 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html JavaClient 查询ES QueryBuilder queryBuilder = QueryBuilders.termQuery("字段","term值"); SearchResponse response = client.prepareSearch("索

前缀和乱搞 uoj 267 魔法小程序

http://uoj.ac/problem/267 本质上\(c[]\)其实是对于每一位做的一个前缀和(高维前缀和) 而\(b[]\)是原数组 每一位的长度是\(a[]\) 对于\(a[i] > 1\)的位 可以知道是不超过\(log_2m\)的 单独考虑每一位 暴力还原 wzz大佬代码400b- momomo #include<bits/stdc++.h> #define int long long #define fo(i, n) for(int i = 1; i <= (n)

如何在Python中快速画图——使用Jupyter notebook的魔法函数(magic function)matplotlib inline

如何在Python中快速画图--使用Jupyter notebook的魔法函数(magic function)matplotlib inline 先展示一段相关的代码: #we test the accuracy of knn and find the k which makes the biggest accuracy k_range=list(range(1,26))#[1,25] scores=[] for k in k_range: knn=KNeighborsClassifier(n_

COGS 696. [IOI1996][USACO 2.3] 最长前缀

★   输入文件:prefix.in   输出文件:prefix.out   简单对比时间限制:1 s   内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中B

bzoj 3669: [Noi2014]魔法森林

3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MB 动点spfa Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住在号节点N.小E需要通过这一片魔法森林,才能够拜访到隐士. 魔法森林中居住了一些妖怪.每当有人经过一条边的时候,这条边上的妖怪就会对其发起攻击.幸运的

【BZOJ-1218】激光炸弹 前缀和 + 枚举

1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1778  Solved: 833[Submit][Status][Discuss] Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值.激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称