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]好方的蛇的更多相关文章

  1. 【BZOJ 3235】 3235: [Ahoi2013]好方的蛇 (单调栈+容斥原理)

    3235: [Ahoi2013]好方的蛇 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 187  Solved: 95 Description 有一天, ...

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

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

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

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

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 基于AT89C51单片机的贪吃蛇电子游戏(仿真)

    有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...

  6. 小菜学习Winform(一)贪吃蛇

    前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...

  7. [AHOI2013]找硬币(搜索)

    [Ahoi2013]找硬币 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 348  Solved: 114[Submit][Status] Descri ...

  8. 使用TypeScript实现简单的HTML5贪吃蛇游戏

    TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构师,已 ...

  9. BZOJ 3233: [Ahoi2013]找硬币( dp )

    dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p,  dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ----------------- ...

随机推荐

  1. 全局唯一ID生成器

    分布式环境中,如何保证生成的id是唯一不重复的? twitter,开源出了一个snowflake算法,现在很多企业都按照该算法作为参照,实现了自己的一套id生成器. 该算法的主要思路为: 刚好64位的 ...

  2. Jmeter入门--工具组成和线程组

    1.Jmeter工具组成部分: 资源生成器:用于生成测试过程中服务器,负载机的资源代码.(LoadRunner中的VuGen) 用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指定的用户行为.(L ...

  3. 【gp数据库】OLTP和OLAP区别详解

    原来一直使用Oracle,新公司使用greenplum后发现系统的并发性差很多,后来才了解因为Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型, ...

  4. Windows 7系统启动MongoDB失败解决办法?

    问题现象: 1.在配置Python环境安装MongoDB时发现在“服务”里面手动启动失败,报错如下: 2.在cmd里面也无法启动,注意这里要以管理员身份启动cmd哦 问题解决: 1.需要先在bin下执 ...

  5. 阿里云全球首次互联网8K直播背后的技术解读

    3月28日,云栖大会·深圳峰会现场,阿里云发布并现场演示了阿里视频云最新8K互联网直播解决方案.这是全球发布的首个8K视频云解决方案,也是全球首次8K互联网视频直播. 视频地址:https://v.q ...

  6. win中使用cmd杀端口

    最近在win开发时,总是遇到端口占用的情况...可能是跑的程序太多了吧 当你测试一个demo时遇到这个就很恶心.. 记一下 netstat -ano | findstr 80 //列出进程极其占用的端 ...

  7. jenkins 安卓打包生成二维码下载

    先来张图看看吧 构思 jenkins gradle 打包apk文件,python myqr 模块生成二维码 放入nginx 访问图片的路径,apk安装包放在 nginx 下载目录. 环境 centos ...

  8. Automapper实现自动映射

    出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用Dto(Data transfer object 数据传输对象),这样在后台往前台传递数据时可以省略不必要的信息,只保留必要 ...

  9. Linux 下安装配置 JDK7 配置环境(debian 7)

    自从从Oracle收购Sun近三年来,已经有很多变化.早在8月,甲骨文将“Operating System Distributor License for Java”许可证终结,这意味着第三方将不可以 ...

  10. 【cs231n】图像分类-Nearest Neighbor Classifier(最近邻分类器)【python3实现】

    [学习自CS231n课程] 转载请注明出处:http://www.cnblogs.com/GraceSkyer/p/8735908.html 图像分类: 一张图像的表示:长度.宽度.通道(3个颜色通道 ...