【BZOJ 3235】 3235: [Ahoi2013]好方的蛇 (单调栈+容斥原理)
3235: [Ahoi2013]好方的蛇
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 187 Solved: 95Description
有一天,可爱的蛇心花怒放,把自己变成了一个正方形!但是她改变的时候
被induce了导致改变出了些问题....按照预设,她应该变成一个N*N的全黑正方形,但是这个正方形出现了一些白的格子...现在她的身体不幸出了些小反应,定义一个subsnake是一个至少有两格的全黑矩形。
现在蛇想让你帮忙求一下一共有多少对不相交的subsnake,答案模10007。
Input
第一行一个整数 N, 接下来N行,每行一个长度为N的字符串,如果是B,那么是黑的,如果是 W那么是白的。
Output
一行一个整数,表示答案
Sample Input
3
BBW
BBW
BWWSample Output
5HINT
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]好方的蛇 (单调栈+容斥原理)的更多相关文章
- BZOJ 3235: [Ahoi2013]好方的蛇
BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Des ...
- 3235: [Ahoi2013]好方的蛇
3235: [Ahoi2013]好方的蛇 链接 分析: 可以求出以每个点为顶点的满足条件的矩形有多少个,单调栈求.设为sum. 然后对这个数组进行二维前缀和,可以求出每个矩阵内,以右下角.左下角为端点 ...
- BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...
- [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】
题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...
- BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】
题目链接 BZOJ3235 题解 求出每个点为顶点,分别求出左上,左下,右上,右下的矩形的个数\(g[i][j]\) 并预处理出\(f[i][j]\)表示点\((i,j)\)到四个角的矩形内合法矩形个 ...
- Bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 单调栈
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 631 Solved: 445[Submi ...
- BZOJ.4566.[HAOI2016]找相同字符(后缀数组 单调栈)
题目链接 给定两个字符串,求它们有多少个相同子串.相同串的位置不同算多个. POJ3145简化版. 后缀自动机做法见这儿,又快又好写(一下就看出差距了..) //13712kb 4076ms #inc ...
- BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)
题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...
- BZOJ3238 [Ahoi2013]差异 【后缀数组 + 单调栈】
题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #in ...
随机推荐
- Google guava 中的Monitor
synchronized 自从Java提供了多线程编程,我们经常需要处理这样的情况:在特定的时间,我们需要限制访问,确保只有一个线程访问我们的代码.Java提供了同步关键字synchronized来实 ...
- spring boot 使用logback日志系统的详细说明
springboot按照profile进行打印日志 log4j logback slf4j区别? 首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样 ...
- JavaScript:详解 Base64 编码和解码
Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...
- Sublime text 2/3 SVN插件及使用方法
Sublime Text是前端利器,作为前端的盆友们已经再熟悉不过了,在项目中经常使用SVN,每次都要切换提交,很麻烦,有了这个SVN插件就很方便了,使用快捷方式提交,更新. Sublime Text ...
- C++ 模板特化以及Typelist的相关理解
近日,在学习的过程中第一次接触到了Typelist的相关内容,比如Loki库有一本Modern C++ design的一本书,大概JD搜了一波没有译本,英文版600多R,瞬间从价值上看到了这本书的价值 ...
- openstack环境下的虚拟机通过浮动IP访问后能ping通外网IP不能ping通域名
1.环境简介 openstack环境下构造Ubuntu系统的VM,VM配置受管子网和自管子网,同时绑定浮动IP 2.通过浮动IP访问VM后,ping www.baidu.com失败,但是通过IP地址p ...
- 详细介绍Linux finger命令的使用
Linux 允许多个用户使用不同的终端同时登陆,Linux finger命令为系统管理员提供知道某个时候到底有多少用户在使用这台Linux主机的方法,对于这个简单的命令我们还是先介绍一下再举例吧. L ...
- geoserver-manager发布style失败
当参数给定没有错误时,最有可能的原因就是: sld文件格式应该以UTF-8无BOM格式编码(自己生成的sld文件多数情况下是以UTF-8格式编码).
- golang基础之一
一.第一个go程序 package main import ( "fmt" ) func main(){ fmt.Println("hello world") ...
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第三部分
前面两篇介绍了SOM的基本概念和算法,第一部分,第二部分,本篇具体展开一下应用中的一些trick设定. SOM设计细节 输出层设计 输出层神经元数量设定和训练集样本的类别数相关,但是实际中我们往往不能 ...
.jpg)