3235: [Ahoi2013]好方的蛇

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 187  Solved: 95

Description

有一天,可爱的蛇心花怒放,把自己变成了一个正方形!但是她改变的时候
被induce了导致改变出了些问题....

按照预设,她应该变成一个N*N的全黑正方形,但是这个正方形出现了一些白的格子...现在她的身体不幸出了些小反应,定义一个subsnake是一个至少有两格的全黑矩形。 

现在蛇想让你帮忙求一下一共有多少对不相交的subsnake,答案模10007。

Input

第一行一个整数 N,   接下来N行,每行一个长度为N的字符串,如果是B,那么是黑的,如果是 W那么是白的。

Output

一行一个整数,表示答案

Sample Input

3
BBW
BBW
BWW

Sample Output

5

HINT

N<=1000

Source

【分析】

  首先考虑白点不能选。f[i][j]表示以(i,j)为左上角的矩形个数。发现这个东西其实类似有障碍点的最大子矩阵问题。【其实求和更容易一些,用一个单调栈就好了。方法自己Y吧。。

  但是怎么统计两两不相交呢?

  首先枚举(i,j)为左上角的矩形,右下角在其左方或上方的矩形就是不相交的。

  但是,有可能算重复。就是这种情况:

  

  减掉就好了。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 1010
#define LL long long
#define Mod 10007 char s[Maxn][Maxn];
int mx[Maxn][Maxn],sm[Maxn][Maxn][];
int q[Maxn]; int n;
void ffind(int k)
{
if(k&)
{
for(int j=;j<=n;j++)
{
int l=,r=;q[]=;
for(int i=;i<=n;i++)
{
if(mx[i][j]==) {sm[i][j][k]=;q[r]=i;l=r+;continue;}
while(l<=r&&mx[i][j]<=mx[q[r]][j]) r--;
sm[i][j][k]=sm[q[r]][j][k]+(i-q[r])*mx[i][j];
q[++r]=i;
}
}
}
else
{
for(int j=;j<=n;j++)
{
int l=,r=;q[]=n+;
for(int i=n;i>=;i--)
{
if(mx[i][j]==) {sm[i][j][k]=;q[r]=i;l=r+;continue;}
while(l<=r&&mx[i][j]<=mx[q[r]][j]) r--;
sm[i][j][k]=sm[q[r]][j][k]+(q[r]-i)*mx[i][j];
q[++r]=i;
}
}
} for(int i=;i<=n;i++) for(int j=;j<=n;j++) if(sm[i][j][k]) sm[i][j][k]--;
if(k==) for(int i=n;i>=;i--) for(int j=;j<=n;j++)
sm[i][j][k]=(sm[i][j-][k]+sm[i+][j][k]-sm[i+][j-][k]+sm[i][j][k])%Mod;
else if(k==) for(int i=;i<=n;i++) for(int j=;j<=n;j++)
sm[i][j][k]=(sm[i][j-][k]+sm[i-][j][k]-sm[i-][j-][k]+sm[i][j][k])%Mod; } int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%s",s[i]+); memset(mx,,sizeof(mx));
for(int i=;i<=n;i++) for(int j=n;j>=;j--) mx[i][j]=(s[i][j]=='W')?:mx[i][j]=+mx[i][j+];
ffind();//zuo shang
ffind();//zuo xia
for(int i=;i<=n;i++) for(int j=;j<=n;j++) mx[i][j]=(s[i][j]=='W')?:mx[i][j]=+mx[i][j-];
ffind();//you shang
ffind();//you xia int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
ans+=1LL*sm[i][j][]*(sm[n][j-][]+sm[i-][n][]-sm[i-][j-][])%Mod;
ans-=1LL*sm[i][j][]*sm[i+][j-][]%Mod;
ans%=Mod;
}
ans=(ans+Mod)%Mod;
printf("%d\n",ans);
return ;
}

2017-04-20 10:52:07

  

【BZOJ 3235】 3235: [Ahoi2013]好方的蛇 (单调栈+容斥原理)的更多相关文章

  1. BZOJ 3235: [Ahoi2013]好方的蛇

    BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Des ...

  2. 3235: [Ahoi2013]好方的蛇

    3235: [Ahoi2013]好方的蛇 链接 分析: 可以求出以每个点为顶点的满足条件的矩形有多少个,单调栈求.设为sum. 然后对这个数组进行二维前缀和,可以求出每个矩阵内,以右下角.左下角为端点 ...

  3. BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈

    BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...

  4. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  5. BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】

    题目链接 BZOJ3235 题解 求出每个点为顶点,分别求出左上,左下,右上,右下的矩形的个数\(g[i][j]\) 并预处理出\(f[i][j]\)表示点\((i,j)\)到四个角的矩形内合法矩形个 ...

  6. Bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 单调栈

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 631  Solved: 445[Submi ...

  7. BZOJ.4566.[HAOI2016]找相同字符(后缀数组 单调栈)

    题目链接 给定两个字符串,求它们有多少个相同子串.相同串的位置不同算多个. POJ3145简化版. 后缀自动机做法见这儿,又快又好写(一下就看出差距了..) //13712kb 4076ms #inc ...

  8. BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)

    题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...

  9. BZOJ3238 [Ahoi2013]差异 【后缀数组 + 单调栈】

    题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #in ...

随机推荐

  1. Shell编程——shell常用命令

    浏览器标签页的切换:Ctrl+Tab [终端]打开终端快捷建:Ctrl+Alt+t关闭终端快捷键:Ctrl+Shift+q打开新的终端标签页快捷键:Ctrl+Shift+t 关闭终端标签页快捷键:Ct ...

  2. (32位)本体学习程序(ontoEnrich)系统配置说明文档

    1.系统环境 32位 Ubuntu 源代码中已经包含在32位下编译生成的.o文件,配置好依赖库(步骤2)后,参考步骤3则可重新link. link无误即可运行程序. 2.依赖库  2.1 boost_ ...

  3. 51nod 1217 Minimum Modular

    N个不同的数a[1],a[2]...a[n],你可以从中去掉K个数,并且找到一个正整数M,使得剩下的N - K个数,Mod M的结果各不相同,求M的最小值. Input 第1行:2个数N, K,中间用 ...

  4. 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)

    题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...

  5. git服务器的简单搭建

    安装git 安装git,参考:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git 创建git仓库 使用ro ...

  6. 【bzoj5050】【bzoj九月月赛H】建造摩天楼

    讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...

  7. tyvj P1050 最长公共子序列

    题目链接:http://tyvj.cn/p/1050 题解: 裸题,只是为了测试LCS模板写对没有…… #include<cstdio> #include<cstring> # ...

  8. 《深入理解Java虚拟机》笔记--第十二章、Java内存模型与线程

    主要内容:虚拟机如何实现多线程.多线程之间由于共享和竞争数据而导致的一系列问题及解决方案. Java内存模型:     Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储 ...

  9. 移动端touch滑屏事件

    <script> var windowHeight = $(window).height(), $body = $("body");// console.log($(w ...

  10. vsftpd.log内容的意义

    vsftpd日志(xferlog格式)的含义 引用: Thu Mar 4 08:12:30 2004 1 202.114.40.242 37 /incoming/index.html a _ o a  ...