题意:一个n*m的方格矩阵,有的格子被涂成了黑色,问该矩阵中有多少个子矩阵,子矩阵不包含黑色格子;

思路:对于一个长为L, 高为H的无黑点矩阵中包含的高为H的子矩阵个数为L+(L-1)+(L-2)+...+1个;这是直接算的一种方法;如何程序表示该计算呢?

for(int i=1; i<=L; i++){
for(int j=i; j>0; j--){
count+=1;
}
}

这样的一个双层循环就表示了上式;那么所有子矩阵个数就是三层循环,高由1->H:

for(int h=1; h<=H; h++){
for(int i=1; i<=L; i++){
for(int j=i; j>0; j--){
count+=h;
}
}
} ​

这是其中没有黑点的;如果在某处加了个黑点又如何计算呢?如下图:

先看高为H(4)的子矩阵个数:以(4, 7)为右下角的高为H的子矩阵个数为3个,由L=4处在向左,就只能构成高为2的子矩阵了;

那么怎么该上边的代码才能得出答案呢?如下:

for(int i=1; i<=H; i++){
for(int j=1; j<=L; j++){
h=i;
for(int k=j; k>0; k--){
h=min(h, i-p[k]);
count+=h;
}
}
}
//p[k]表示第k列中在i行上边的第一个黑点的位置,

上边代码就是本题的核心代码了;然后H用n代替,L用m代替,这样复杂度为O(n*m*m);然后标记黑点的位置每次维护h就可以了;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int b[100010][110], up[110];
int main(){
int T, cas=0;
scanf("%d", &T);
while(T--){
int n, m, K;
scanf("%d%d%d", &n, &m, &K);
for(int i=0; i<=n; i++){
for(int j=0; j<=m; j++){
b[i][j]=0;
up[j]=0;
}
}
for(int i=0; i<K; i++){
int x, y;
scanf("%d%d", &x, &y);
b[x][y]=1;
}
ll ans=0;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
if(b[i][j]){
up[j]=i;
}
}
for(int j=1; j<=m; j++){
ll minn=0x7f7f7f7f7f7f7f7f;
for(int k=j; k>0; k--){
minn=min(minn, (ll)(i-up[k]));
ans+=minn;
}
}
}
printf("Case #%d: %lld\n", ++cas, ans);
}
return 0;
}

The writing on the wall的更多相关文章

  1. 南京网络赛B-The writing on the wall

    30.43% 2000ms 262144K Feeling hungry, a cute hamster decides to order some take-away food (like frie ...

  2. ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall

    题目链接:https://nanti.jisuanke.com/t/30991 2000ms 262144K   Feeling hungry, a cute hamster decides to o ...

  3. ACM-ICPC 2018 南京赛区网络预赛 B The writing on the wall(思维)

    https://nanti.jisuanke.com/t/30991 题意 一个n*m的方格矩阵,有的格子被涂成了黑色,问该矩阵中有多少个子矩阵,子矩阵不包含黑色格子. 分析 参考https://bl ...

  4. The writing on the wall 南京网络赛2018B题

    样例输入复制 2 3 3 0 3 3 1 2 2 样例输出复制 Case #1: 36 Case #2: 20 题目来源 ACM-ICPC 2018 南京赛区网络预赛 题意: 就是求图中去掉涂黑的方格 ...

  5. ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall (暴力)

    题意:一个n*m的方格矩阵,有的格子被涂成了黑色,问该矩阵中有多少个子矩阵,子矩阵不包含黑色格子; 思路:对于一个长为L, 高为H的无黑点矩阵中包含的高为H的子矩阵个数为L+(L-1)+(L-2)+. ...

  6. python 词云学习

    词云入门 三步曲 数据获取:使用爬虫在相关网站上获取文本内容 数据清洗:按一定格式对文本数据进行清洗和提取(文本分类,贴标签) 数据呈现:多维度呈现和解读数据(计算,做表,画图) 一 模块的安装 pi ...

  7. ACM-ICPC 2018 南京赛区网络预赛 Solution

    A. An Olympian Math Problem cout << n - 1 << endl; #include <bits/stdc++.h> using ...

  8. 2018 ACM 网络选拔赛 南京赛区

    A. An Olympian Math Problem #include <cstdio> #include <cstdlib> #include <cmath> ...

  9. 2018ICPC南京网络赛

    2018ICPC南京网络赛 A. An Olympian Math Problem 题目描述:求\(\sum_{i=1}^{n} i\times i! \%n\) solution \[(n-1) \ ...

随机推荐

  1. bitbucket+sourcetree+p4merge for windows 版本控制

    这里选择bitbucket作为仓库的原因是,它能够在设置私有仓库的前提下组建5人团队 一:https://bitbucket.org/ 注册bitbucket 二:http://www.sourcet ...

  2. DataGridView控件“至少有一列没有单元格模板”问题处理

    这个问题一般是没有设置单元格模板造成的. mdgv.Columns[].CellTemplate = new DataGridViewTextBoxCell();

  3. 网站的PV,UV,IP名词解释

    PV:PV 是Page Views的缩写,即页面浏览量,用户每一次对网站中的每个网页访问均被记录一次.注意,访客每刷新一次页面,pv就增加一次. UV:UV是Unique Visitor的缩写,即独立 ...

  4. cocos2dx lua bug之module &#39;lsqlite3&#39; not found

    05-27 15:41:01.360: D/cocos2d-x debug info(7261): [LUA-print] -------------------------------------- ...

  5. JAVA多线程学习2--线程同步

    一.线程同步介绍 同步:就是协同步调,按照预定的先后顺序执行.比如:你说完我再说. 线程同步:访问同一个共享资源的时候多个线程能够保证数据的安全性.一致性. 二.JAVA中实现线程同步的方法 实现进程 ...

  6. OO第二次博客作业(第二单元总结)

    在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...

  7. Codeforces 652F Ants on a Circle

    Ants on a Circle 感觉这个思路好巧妙啊. 我们能发现不管怎么碰撞,初始态和最终态蚂蚁间的相对顺序都是一样的, 并且所占的格子也是一样的, 那么我们就只需要 找到其中一个蚂蚁的最终位置就 ...

  8. Confluence 6 安装 Active Directory 证书服务器

    如果证书服务器已经安装了的话,跳过这一步骤,直接进入下一步.下面步骤中的屏幕截图是从 Windows 2008 服务器版上安装的截图,针对 2000 和 2003 安装过程是一样的. 作为系统管理员登 ...

  9. servlet 中 service ,doGet , doPost 关系

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

  10. [Leetcode Week3]Clone Graph

    Clone Graph题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/clone-graph/description/ Description Clon ...