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. (二)Hadoop例子——运行example中的wordCount例子

    Hadoop例子——运行example中的wordCount例子 一.   需求说明 单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为 MapReduce版"Hello ...

  2. Xcode下 gdb 调试命令

    Xcode的调试器为用户提供了一个GDB的图形化界面,GDB是GNU组织的开放源代码调试器.您可以在Xcode的图形界面里做任何事情:但是,如果您需要您可以在命令行里使用GDB的命令,且gdb可以在终 ...

  3. onvif客户端

    前言 做开发有8年时间了,ffmpeg和onvif与我是特别有缘的了(说着玩的,我更认为是因为他们确实强大^_^). ffmpeg在毕业设计时就有用到,5年后做windows.linux播放库时又有用 ...

  4. SuSE Linux Supervisor的安装与使用案例

      建议使用 root 管理员账户操作 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务器一开机就启动服务器 ...

  5. mysql军规

    总是在灾难发生后,才想起容灾的重要性.总是在吃过亏后,才记得曾经有人提醒过. 一,核心军规 不在数据库做计算,cpu计算务必移至业务层 控制单表数据量,单表记录控制在千万级 控制列数量,字段数控制在2 ...

  6. (二) Mysql 数据类型简介

    第一节:整数类型.浮点数类型和定点数类型 1,整数类型 2,浮点数类型和定点数类型 M 表示:数据的总长度(不包括小数点): D 表示:小数位: 例如 decimal(5,2)      123.45 ...

  7. C++的一大误区——深入解释直接初始化与复制初始化的区别

      转自:http://blog.csdn.net/ljianhui/article/details/9245661 不久前,在博客上发表了一篇文章——提高程序运行效率的10个简单方法,对于其中最后一 ...

  8. 初涉yield

    function* a(i) { console.log('here we go'); yield i; // 必须有*,不然b会作为返回值,而不是执行 yield* b(i); yield i+10 ...

  9. 2.4G无线模块NRF2401

    RF24L01+,是工作在2.4~2.5GHz 频段的,具备自动重发功能,6 个数据传输通道,最大无线传输速率为2Mbits.MCU 可与该芯片通过SPI 接口访问芯片的寄存器进行配置,达到控制模块. ...

  10. loadrunner参数取值方法总结

    在参数设置位置有两个地方:Select next row –下一行的取值方式(针对用户)Sequential 顺序的,即所有用户都是按照同一种方式取值(都是按照Update value on方式取值, ...