听说n^4能过,于是愉快地敲了n^4  ,还带了两个最优性剪枝。。

结果事实证明是别人家的n^4.。。(wys?

很奇怪玄学剪枝有时2^50次方都能过,为什么这个连1e10都过不了。.。

TLE代码:

#include<iostream>
#include<cstdio>
using namespace std;
int x,y,z,xx[155][155][155],yy[155][155][155],zz[155][155][155],i,j,k,lin[155],a,qi,tu[155][155][155],ans;
char ch;
int main()
{
    scanf("%d%d%d",&y,&x,&z);
    for(i=1;i<=x;i++)
    for(j=1;j<=y;j++)
    for(k=1;k<=z;k++)
    {
        scanf("%c",&ch);
        while(ch!='N'&&ch!='P')scanf("%c",&ch);
        if(ch=='N')tu[i][j][k]=1;
        else tu[i][j][k]=0;
    }
    for(i=1;i<=x;i++)
    for(j=1;j<=y;j++)
    {
    for(k=1;k<=z;k++)
    {
    lin[k]=lin[k-1]+tu[i][j][k];
    xx[i][j][k]=xx[i][j-1][k]+lin[k];
    }}
        for(i=1;i<=y;i++)
    for(j=1;j<=x;j++)
    {
    for(k=1;k<=z;k++)
    {
    lin[k]=lin[k-1]+tu[j][i][k];
    yy[i][j][k]=yy[i][j-1][k]+lin[k];
    }}
            for(i=1;i<=z;i++)
    for(j=1;j<=x;j++)
    {
    for(k=1;k<=y;k++)
    {
    lin[k]=lin[k-1]+tu[j][k][i];
    zz[i][j][k]=zz[i][j-1][k]+lin[k];
    }}
    for(i=1;i<=x;i++)
    for(j=1;j<=y;j++)
for(a=min(x-i,y-j);a>=0;a--)
{   if(4*(a+1)*z<=ans)break;
qi=0;
    for(k=1;k<=z;k++)
    {
if(4*(z-qi+1)*(a+1)<=ans)break;
if(zz[k][i+a][j+a]-zz[k][i-1][j+a]-zz[k][i+a][j-1]+zz[k][i-1][j-1]==(a+1)*(a+1))
{
    ans=max(ans,4*(a+1)*(k-qi));
}else  qi=k;
    }
}
    for(i=1;i<=y;i++)
    for(j=1;j<=z;j++)
for(a=min(y-i,z-j);a>=0;a--)
{   if(4*(a+1)*x<=ans)break;
qi=0;
    for(k=1;k<=x;k++)
    {
if(4*(x-qi+1)*(a+1)<=ans)break;
if(xx[k][i+a][j+a]-xx[k][i-1][j+a]-xx[k][i+a][j-1]+xx[k][i-1][j-1]==(a+1)*(a+1))
{
    ans=max(ans,4*(a+1)*(k-qi));
}else  qi=k;
    }
}   

    for(i=1;i<=x;i++)
    for(j=1;j<=z;j++)
for(a=min(x-i,z-j);a>=0;a--)
{
    if(4*(a+1)*y<=ans)break;
qi=0;
    for(k=1;k<=y;k++)
    {
if(4*(y-qi+1)*(a+1)<=ans)break;
if(xx[k][i+a][j+a]-xx[k][i-1][j+a]-xx[k][i+a][j-1]+xx[k][i-1][j-1]==(a+1)*(a+1))
{
    ans=max(ans,4*(a+1)*(k-qi));
}else  qi=k;
    }
}
    printf("%d",ans);
}

正解是单调栈。。

首先先选一个为底面,  把 他分成好几层    然后再枚举矩形右下角坐标,,这时候暴力的做法就是枚举正方形大小,然而这样做忽略了

整体满足,部分也满足  的性质。所以对于一个正方形,若以n为边长合适,则以1~n为边长也一定合适

所以就在这一个线所在点的矩形最大的n都考虑进来,就相当于

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 155
int k,i,j,zuo[N],you[N],f[N][N][N],sta[N],top,ans,x,y,z;
char tu[N][N][N],tu2[N][N][N];
void work(int z,int x,int y)
{for(k=1;k<=z;k++){for(i=1;i<=x;i++){for(j=1;j<=y;j++){if(tu[i][j][k]=='N')f[k][i][j]=min(f[k][i-1][j-1],min(f[k][i-1][j],f[k][i][j-1]))+1;      else f[k][i][j]=0;}        }   }for(j=1;j<=x;j++)for(k=1;k<=y;k++){
memset(zuo,0,sizeof(zuo));
top=0;
sta[0]=0;
for(i=1;i<=z;i++)
{while(top&&f[sta[top]][j][k]>=f[i][j][k])--top;
zuo[i]=i-sta[top];
sta[++top]=i;
}       memset(you,0,sizeof(you));
top=0;
sta[0]=z+1;
for(i=z;i>=1;i--)
{while(top&&f[sta[top]][j][k]>=f[i][j][k])--top;
you[i]=sta[top]-i;
sta[++top]=i;
}
for(i=1;i<=z;i++)
if(tu[j][k][i]=='N')ans=max(ans,(zuo[i]+you[i]-1)*4*f[i][j][k]);
}
}
int main()
{scanf("%d%d%d",&y,&x,&z);for(i=1;i<=x;i++)for(j=1;j<=y;j++)for(k=1;k<=z;k++){scanf("%c",&tu[i][j][k]);while(tu[i][j][k]!='N'&&tu[i][j][k]!='P')scanf("%c",&tu[i][j][k]);tu2[i][j][k]=tu[i][j][k];        }
work(z,x,y);for(i=1;i<=x;i++)for(j=1;j<=y;j++)for(k=1;k<=z;k++){tu[j][k][i]=tu2[i][j][k];     }
work(x,y,z);for(i=1;i<=x;i++)for(j=1;j<=y;j++)for(k=1;k<=z;k++){tu[i][k][j]=tu2[i][j][k];     }
work(y,x,z);    printf("%d",ans);
} 

2017.10.12 礼物(zjoi2011) 失败总结相关推荐

  1. 2017.10.12 记者招待会

    2017.10.12  记者招待会 记者招待会 看到这个题目,你会不会吓一跳?一名普通的员工,哪里会参加记者招待会?是的,不是我参加.你脆弱的小心脏可以简单的修正一下,因为后面还有一个劲爆的消息:学生 ...

  2. 2017.10.12 小Q的无敌异或 失败总结

    第一问是可以O(n)的 二进制位是独立的,所以直接分开算即可.. 记一个前缀和,开桶装0.1的个数     然后每次新加入一个点就直接更新就可以了 第二问就比较难了,,手玩只能发现最低位可以这么搞,对 ...

  3. 2017.9.12 人员雇佣 失败总结

    网络流好难啊,还被卡题意了(不卡题意我也不会) 然后强套昨天的图,其实样子基本是对的,,但是实际是错的 这个题的模型就是: 一个点选s有贡献, 两个点同时选s有贡献, 两个点同时不选s无贡献, 两个点 ...

  4. 2017.3.12 分割矩阵 失败总结

    感觉再也做不出题了 QAQ.. 其实,第一眼看上去我依然是懵逼的, 发现只要有左上角的坐标和左下角的坐标是可以10^4 预处理区间和的    简单划了一下只有O((a*b)^n)的做法. 然后发现沿数 ...

  5. 2017/10/12 表格与表单

    1 2 文本框 文本域男 女 1234 转载于:https://www.cnblogs.com/buzhiheyan/p/7658754.html

  6. 2017.10.23 硬币购物 失败总结

    这题常规套路根本用不上 一共就四枚硬币,所以要考虑对硬币的算法 然而谁能想到容斥啊... 首先查询是很多的,需要对每个查询做到尽量常数级 首先排除dp查询,因为状态肯定不支持O(1)查询 然后需要想到 ...

  7. 2017.10.22 方格染色 失败总结

    详细题解网上有好多.. 一开始想用一个并查集维护  确定关系 一个并查集维护相等关系 但会出现一些无解判不出来(原因未知) 所以就只能写加权并查集,记录每个点和他根节点的相等关系:0相等 1不等 然后 ...

  8. 2017.10.15 旅行comf 失败总结

    越是取值要求奇怪的题,范围不大的题,就越需要枚举. 这个比值的要求非常特殊,他没有任何最优值可以取,所以不能考虑dp及其相似算法 所以就要考虑枚举一个求另一个,易知枚举了最小的,加的必须是比他大的,所 ...

  9. 2017.10.11 Problem c 失败总结

    一开始就想偏了.. 首先计数题 30s + n<=300显然是让你n^3 dp的 先从手玩开始考虑 注意到从大到小出现的数字个数是可以判断有无解的 ,,然后可以画出一些区间的条件  如(> ...

最新文章

  1. MapInfo中常用查询函数及用法
  2. Spring MVC ajax:post/get 的具体实现
  3. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170329
  4. 分片表怎么建表_经验放送!后端开发实战笔记之如何设计大数据量表结构
  5. 小谈Online-game服务器端设计(3)
  6. unicode html转义字符,HTML转义字符 Unicode和CSS伪类介绍(示例代码)
  7. Python 数据结构与算法——引用计数
  8. SQL注入详解,看这篇就够了
  9. 计算机表格计算公式加法,加法公式excel,excel表格如何用公式计算加减乘除混合运算?...
  10. java使用RabbitMQ,学习了解
  11. 植物大战僵尸:你还在因为玩不过僵尸而气到吃电脑吗?不要怕,教你修改用户存档,逆天翻盘,吊打僵尸**
  12. python实用程序育儿法下载_Python高级编程
  13. 11 MySQL视图
  14. 红孩儿编辑器的模块设计15
  15. Mac系统升级中途断电/关机,升级/开机失败的恢复方法
  16. yarn : 无法加载文件 D:\Development\nvm\node_global\yarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.c
  17. 微信小程序获取微信绑定授权手机号
  18. chmod 权限777 -rwxrwxrwx是什么意思
  19. 干货分享|串流游戏软件大比拼
  20. 虚数的意义,虚数到底是什么

热门文章

  1. spikingjelly的20201221版本跑通ANN2SNN
  2. 高等组合学笔记(十五):容斥原理,错排问题
  3. Word中如何保证正文首行缩进其他标题不动
  4. k8s查看pod的yaml文件_每天5分钟|轻松掌握开发工作中必会的k8s-yaml配置说明和常用命令...
  5. docker hub push_如何制作Docker镜像(image)?
  6. sql 拼接int类型的字段_这才是SQL优化的正确姿势!
  7. CSS的七种基本选择器及其权值
  8. 小学计算机学情分析,小学信息技术教学计划【三篇】
  9. java 资深_Java架构师之路:从Java码农到资深架构师
  10. linux c普通用户怎么判断键盘是否按动_网络没问题,电脑却无法联网怎么办?win10无法联网搞定方式举例...