3235: [Ahoi2013]好方的蛇
3235: [Ahoi2013]好方的蛇
分析:
可以求出以每个点为顶点的满足条件的矩形有多少个,单调栈求。设为sum。
然后对这个数组进行二维前缀和,可以求出每个矩阵内,以右下角、左下角为端点的矩形有多少个,分别设为f,g。
然后可以枚举一个点(x,y),计算有多少个矩形的左上角是这个点,然后分别计算x上面的矩形,和y左面的矩形,与它不相交。此时一个每个矩形都和它左上角右上角的矩形计算了两次,减去即可。
调来调去,最后发现模数多写了个0。。。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int mod = , N = ;
int a[N][N], f[N][N], g[N][N], u[N];
struct Node{ int x, sum, len; } sk[N];
char s[N]; int main() {
int n = read();
for (int i = ; i <= n; ++i) {
scanf("%s", s + );
for (int j = ; j <= n; ++j) a[i][j] = s[j] == 'B';
}
int top = , sum = , ans = ;
memset(u, , sizeof(u));
for (int k, i = ; i <= n; ++i) {
for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
top = sum = ;
for (int j = ; j <= n; ++j) {
k = ;
while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
sk[++top] = (Node){u[j], u[j] * k, k};
sum += sk[top].sum - a[i][j];
f[i][j] = f[i - ][j] + f[i][j - ] - f[i - ][j - ] + sum; f[i][j] %= mod;
sum += a[i][j];
}
} memset(u, , sizeof(u));
for (int k, i = ; i <= n; ++i) {
for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
top = sum = ;
for (int j = n; j; --j) {
k = ;
while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
sk[++top] = (Node){u[j], u[j] * k, k};
sum += sk[top].sum - a[i][j];
g[i][j] = g[i - ][j] + g[i][j + ] - g[i - ][j + ] + sum; g[i][j] %= mod;
sum += a[i][j];
}
} memset(u, , sizeof(u));
for (int k, i = n; i; --i) {
for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
top = sum = ;
for (int j = n; j; --j) {
k = ;
while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
sk[++top] = (Node){u[j], u[j] * k, k};
sum += sk[top].sum - a[i][j];
ans += sum * f[n][j - ] + sum * f[i - ][n] - sum * f[i - ][j - ]; ans %= mod;
sum += a[i][j];
}
} memset(u, , sizeof(u));
for (int k, i = n; i; --i) {
for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
top = sum = ;
for (int j = ; j <= n; ++j) {
k = ;
while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
sk[++top] = (Node){u[j], u[j] * k, k};
sum += sk[top].sum - a[i][j];
ans = (ans - sum * g[i - ][j + ] % mod + mod) % mod;
sum += a[i][j];
}
}
cout << (ans + mod) % mod;
return ;
}
3235: [Ahoi2013]好方的蛇的更多相关文章
- 【BZOJ 3235】 3235: [Ahoi2013]好方的蛇 (单调栈+容斥原理)
3235: [Ahoi2013]好方的蛇 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 187 Solved: 95 Description 有一天, ...
- BZOJ 3235: [Ahoi2013]好方的蛇
BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Des ...
- BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】
题目链接 BZOJ3235 题解 求出每个点为顶点,分别求出左上,左下,右上,右下的矩形的个数\(g[i][j]\) 并预处理出\(f[i][j]\)表示点\((i,j)\)到四个角的矩形内合法矩形个 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 基于AT89C51单片机的贪吃蛇电子游戏(仿真)
有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...
- 小菜学习Winform(一)贪吃蛇
前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...
- [AHOI2013]找硬币(搜索)
[Ahoi2013]找硬币 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 348 Solved: 114[Submit][Status] Descri ...
- 使用TypeScript实现简单的HTML5贪吃蛇游戏
TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构师,已 ...
- BZOJ 3233: [Ahoi2013]找硬币( dp )
dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p, dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ----------------- ...
随机推荐
- npm install时报错“Unexpected end of JSON input while parsing near...”解决方法
执行:npm cache clean --force 即可解决此问题
- [翻译] CSStickyHeaderFlowLayout
CSStickyHeaderFlowLayout https://github.com/jamztang/CSStickyHeaderFlowLayout Parallax, Sticky Heade ...
- IP地址分类及CIDR划分方法
IP地址的分类和表示有三种形式,1.分类的IP地址.2.子网划分.3.无分类编址CIDR 1.分类的IP地址 IP地址:: = {<网络号>,<主机号>} 不同的网络号和主机号 ...
- 铁乐学Python_Day34_Socket模块2和黏包现象
铁乐学Python_Day34_Socket模块2和黏包现象 套接字 套接字是计算机网络数据结构,它体现了C/S结构中"通信端点"的概念. 在任何类型的通信开始之前,网络应用程序必 ...
- 铁乐学python_shelve模块详解
python序列化模块-shelve模块详解 shelve:vt. 将(书等)放置在架子上:搁置,将某事放到一旁不予考虑:将-搁在一边:装搁架于: 个人感觉有点像字典缓存?暂时搁置到一旁的意思? 研究 ...
- Hadoop HBase概念学习系列之列、列簇(十二)
列在列簇中依照字典排序.例如,列簇是基础信息或公司域名或水果类.列是基础信息:面貌.基础信息:年龄.公司域名:org.公司域名:edu.水果类:苹果.水果类:香蕉. 列 = 列簇:列修饰符 ...
- XGBoost 输出特征重要性以及筛选特征
1.输出XGBoost特征的重要性 from matplotlib import pyplot pyplot.bar(range(len(model_XGB.feature_importances_) ...
- T-SQL 标识符
在T-SQL语言中,对SQLServer数据库及其数据对象(比如表.索引.视图.存储过程.触发器等)需要以名称来进行命名并加以区分,这些名称就称为标识符. 通常情况下,SQLServer数据库.数据库 ...
- Spfa(最短路求解)
spfa(最短路求解) 模板: #include<iostream> #include<cstdio> #include<queue> #include<cs ...
- 使用Oracle的instr函数与索引配合提高模糊查询的效率
使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:1.select * from tb wher ...