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. 实用的 Node.js 教程,工具和资源

    这里分享一批实用的实用的 Node.js 教程,工具和资源. Node.js是一个建立在Chrome之上的JavaScript运行时平台,可方便地构建快速,可扩展的网络应用程序.Node.js使用事件 ...

  2. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)

    [题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...

  3. linux内核数据结构之链表【转】

    转自:http://www.cnblogs.com/Anker/p/3475643.html 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结 ...

  4. windows安装React Native开发运行环境

    React Native是什么 React Native是facebook开源的一个用于开发app的框架.React Native的设计理念:既拥有Native (原生) 的用户体验.又保留React ...

  5. angular项目中使用ngSemantic

    npm install ng-semantic --save npm install jquery --save 下载 Official Semantic UI bundle ( .zip ) fro ...

  6. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...

  7. Lynx以纯文本的形式下载网页

    Lynx是一款基于命令行的web浏览器 [root@test88 ~]# yum install lynx -y [root@test88 ~]# lynx www.baidu.com 以纯文本的形式 ...

  8. #include<stdarg.h> 可变参数使用

    今天上计算方法这课时觉得无聊至极,于是拿出C++编程之道来看了看..无意之中看到了#include<stdarg.h> va_list,va_start,va_end等东西,不知是怎么用的 ...

  9. 使用coding云作为git远程库

    1.在命令行中创建GIT仓库 mkdir DriveAssistant cd DriveAssistant git init echo "# DriveAssistant" > ...

  10. 458. Poor Pigs

    There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...