3235: [Ahoi2013]好方的蛇

链接

分析:

  可以求出以每个点为顶点的满足条件的矩形有多少个,单调栈求。设为sum。

  然后对这个数组进行二维前缀和,可以求出每个矩阵内,以右下角、左下角为端点的矩形有多少个,分别设为f,g。

  然后可以枚举一个点(x,y),计算有多少个矩形的左上角是这个点,然后分别计算x上面的矩形,和y左面的矩形,与它不相交。此时一个每个矩形都和它左上角右上角的矩形计算了两次,减去即可。

  调来调去,最后发现模数多写了个0。。。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<cctype>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #include<map>
  11. using namespace std;
  12. typedef long long LL;
  13.  
  14. inline int read() {
  15. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  16. for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  17. }
  18.  
  19. const int mod = , N = ;
  20. int a[N][N], f[N][N], g[N][N], u[N];
  21. struct Node{ int x, sum, len; } sk[N];
  22. char s[N];
  23.  
  24. int main() {
  25. int n = read();
  26. for (int i = ; i <= n; ++i) {
  27. scanf("%s", s + );
  28. for (int j = ; j <= n; ++j) a[i][j] = s[j] == 'B';
  29. }
  30. int top = , sum = , ans = ;
  31. memset(u, , sizeof(u));
  32. for (int k, i = ; i <= n; ++i) {
  33. for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
  34. top = sum = ;
  35. for (int j = ; j <= n; ++j) {
  36. k = ;
  37. while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
  38. sk[++top] = (Node){u[j], u[j] * k, k};
  39. sum += sk[top].sum - a[i][j];
  40. f[i][j] = f[i - ][j] + f[i][j - ] - f[i - ][j - ] + sum; f[i][j] %= mod;
  41. sum += a[i][j];
  42. }
  43. }
  44.  
  45. memset(u, , sizeof(u));
  46. for (int k, i = ; i <= n; ++i) {
  47. for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
  48. top = sum = ;
  49. for (int j = n; j; --j) {
  50. k = ;
  51. while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
  52. sk[++top] = (Node){u[j], u[j] * k, k};
  53. sum += sk[top].sum - a[i][j];
  54. g[i][j] = g[i - ][j] + g[i][j + ] - g[i - ][j + ] + sum; g[i][j] %= mod;
  55. sum += a[i][j];
  56. }
  57. }
  58.  
  59. memset(u, , sizeof(u));
  60. for (int k, i = n; i; --i) {
  61. for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
  62. top = sum = ;
  63. for (int j = n; j; --j) {
  64. k = ;
  65. while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
  66. sk[++top] = (Node){u[j], u[j] * k, k};
  67. sum += sk[top].sum - a[i][j];
  68. ans += sum * f[n][j - ] + sum * f[i - ][n] - sum * f[i - ][j - ]; ans %= mod;
  69. sum += a[i][j];
  70. }
  71. }
  72.  
  73. memset(u, , sizeof(u));
  74. for (int k, i = n; i; --i) {
  75. for (int j = ; j <= n; ++j) u[j] = a[i][j] ? u[j] + : ;
  76. top = sum = ;
  77. for (int j = ; j <= n; ++j) {
  78. k = ;
  79. while (top && sk[top].x > u[j]) k += sk[top].len, sum -= sk[top--].sum;
  80. sk[++top] = (Node){u[j], u[j] * k, k};
  81. sum += sk[top].sum - a[i][j];
  82. ans = (ans - sum * g[i - ][j + ] % mod + mod) % mod;
  83. sum += a[i][j];
  84. }
  85. }
  86. cout << (ans + mod) % mod;
  87. return ;
  88. }

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. oracle使用索引和不使用索引性能分析

    首先准备一张百万条数据的表,这样分析数据差距更形象! 下面用分页表数据对表进行分析,根据EMP_ID 字段排序,使用索引和不使用索引性能差距! sql查询语法准备,具体业务根据具体表书写sql语法: ...

  2. datediff

    DateDiff()是计算机函数. 中文名 日期比较函数 外文名 DateDiff() 作    用 得 出两个日期之间的间隔 用    途 返回两个日期之间的差值 允许数据类型 timeinterv ...

  3. SCCM2012安装、配置

    1.sql server2012,排序规则选择:SQL_Latin1_General_CP1_CI_AS1.扩展AD架构2.打开ad用户和计算机,高级--system 容器授予 sccm服务器 完全控 ...

  4. js和java判断值为空的方式

    js方式判断值为空: name == ""; java方式判断值为空: name==null || name.trim().isEmpty();注:name==null要在前面,不 ...

  5. java中常用Redis操作

     stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向 ...

  6. mac lnmp

    Mac下安装LNMP(Nginx+PHP5.6)环境 Mac下安装LNMP(Nginx+PHP5.6)环境 安装Homebrew 最近工作环境切换到Mac,所以以OS X Yosemite(10.10 ...

  7. php箭头符号

    ->这个箭头是调用类中的函数  比如  class a  {  function b()  {    echo ’a’;  }  }  $a=new a;  $a->b();  输出:a ...

  8. 'Table is Marked as crashed and should be repaired Error'.Mysql表损坏解决方案

    问题表现:由于服务器崩溃导致表损坏无法打开或者能打开但是无法写入数据(提示主键重复但实际没有该主键且该主键值在最大值范围内). 本文提供两种检查修复方式:mysqlcheck 和 myisamchk ...

  9. c++课程学习(未完待续)

    关于c++课程学习 按照计划,我首先阅读谭浩强c++程序设计一书的ppt,发现第一章基本上都是很基础的东西. 同时,书中与班导师一样,推荐了使用visual c++. 而师爷的教程里面推荐使用的是ec ...

  10. c++——register关键字、struct类型、bool关键字、三目运算符

    register关键字增强 //register关键字 请求编译器让变量a直接放在寄存器里面,速度快 //在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容 /* //1 r ...