牛客网暑期ACM多校训练营(第七场)J题(Sudoku Subrectangles)题解
一、题意
给定一个高度为$n$,宽度为$m$的字母矩形(有大写和小写字母,共$52$种),问里面有多少个子矩形是“数独矩形”。数独矩形是指,该矩形内每一行内元素都不相同,每一列内元素也不相同。
二、思路
对于每一个点$(i, j)$,预处理出$R[i][j]$,表示在第$i$行从第$j$列开始,往右一直到$R[i][j]$位置,这一段内所有元素都不相同。同理,再预处理出$D[i][j]$,表示在第$j$列从第$i$行开始,往下一直到$D[i][j]$位置,这一段内所有元素都不相同。显然,无论是往右还是往下这样的一段,长度都不会超过$52$。形式表示就是,$max\{R[i][j]\}=52(1 \le i \le n,1 \le j \le m)$,$max\{D[i][j]\}=52(1 \le i \le n,1 \le j \le m)$。
所以这部分的ACM版时间复杂度为$O(52*n*m)$。
接下来,枚举每一个点$(i, j)$,统计以点$(i, j)$作为左上角的数独矩形的个数。记住,一定要以点$(i, j)$作为左上角。
示意图如下,其中,绿色竖条代表$D[i][k](j \le k \le R[i][j])$,黄色横点条代表$R[k][j](i \le k \le D[i][j])$。

从$i$开始枚举每一行(显然只需要枚举到$D[i][j]$即可,最多循环$52$次),从第$i$行开始,记录一个右边界minr,表示:所有以$(i, j)$为左上角的行数为$k-i+1$的数独矩形最右边可到达的边界。假设当前在第$k$行,当前的右边界为$minr$,那么,所有以$(i, j)$为左上角的行数为$k-i+1$的数独矩形的个数为$minr-j+1$。举个例子,对于上图中,假设左上角坐标为$(i, j)$,当前枚举的行号$k=i$,则$minr=j+7$,这一行中数独矩形的个数为$minr-j+1=8$个,也就是$[(i, j)], [(i, j), (i, j+1)], [(i, j), (i, j+1), (i, j+2)], \dots, [(i, j), (i, j+1), (i, j+2), \dots, (i, minr)]$。
当枚举的行号$k=i+1$时,此时$minr=j+5=R[k][j]$,行数为两行(第$i$行和第$i+1$行)中数独矩形的个数为$minr-j+1=6$个。也就是:

后面的同理。然后,要注意的是,当$min\{D[i][k]\}(j \le k \le minr) < k$($j$~$minr$之间的最短的绿色竖条到不了$k$)或者$R[k][j] < minr$(第$k$行的黄色横点条到不了$minr$)时,说明以点$(i, j)$为左上角的高度为$k-i+1$的数独矩形的个数没有$minr-j+1$个,需要减小$minr$。
总的ACM版时间复杂度为$O(52*n*m)$。
三、代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1010
char s[MAXN][MAXN];
int n, m, R[MAXN][MAXN], D[MAXN][MAXN];
int main() {
// freopen("input.txt", "r", stdin);
// freopen("output2.txt", "w", stdout);
scanf("%d%d", &n, &m);
; i <= n; ++i) {
scanf();
; j <= m; ++j) {
;
;
}
}
; i <= n; ++i) {
; j <= m; ++j) {
, m), k = j;
;
for(k = j; k <= r; ++k) {
))b |= 1LL << s[i][k];
else {
R[i][j] = k - ;
break;
}
} )R[i][j] = k - ;
}
}
; j <= m; ++j) {
; i <= n; ++i) {
, n), k = i;
;
for(k = i; k <= r; ++k) {
))b |= 1LL << s[k][j];
else {
D[i][j] = k - ;
break;
}
} )D[i][j] = k - ;
}
}
;
];
; i <= n; ++i) {
; j <= m; ++j) {
, min(R[i][j], m)), k = j, minr;
mind[] = D[i][j];
; k <= r; ++k) {
mind[k - j] = min(mind[k - j - ], D[i][k]);
}
r = min(i + , min(D[i][j], n)), k = i, minr = R[i][j];
for(k = i; k <= r; ++k) {
while(minr > j && (R[k][j] < minr || mind[minr - j] < k))minr--;
ans += minr - j + ;
}
}
}
cout << ans << '\n';
;
}
牛客网暑期ACM多校训练营(第七场)J题(Sudoku Subrectangles)题解的更多相关文章
- 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)
题目链接: https://www.nowcoder.com/acm/contest/140/J 思路: 都写在代码注释里了,非常好懂.. for_each函数可以去看一下,遍历起vector数组比较 ...
- 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?
牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...
- 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学
牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)
链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...
- 牛客网暑期ACM多校训练营(第九场) A题 FWT
链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...
- 牛客网暑期ACM多校训练营(第九场)D
链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...
- 牛客网暑期ACM多校训练营(第二场)B discount
链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
- 牛客网暑期ACM多校训练营(第二场) I Car 思维
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n ...
随机推荐
- tomcat conf目录下文件的作用
本文以apache-tomcat-6.0.26为准介绍 1. web.xml: 默认(欢迎)文件的设置 配置包括:主要是配置servlet,包括初始化参数,设置session等 <serv ...
- apache的<directory> 语句以及属性的含义
在整完apache和tomcat的之后我觉得有必要把<directory>和它下面的属性捋顺一下 如何访问根目录下的目录http://192.168.1.12/test/ 第一.缺省apa ...
- mdadm 创建md 删除md步骤
最近在使用mdadm创建和删除RAID设备.但是在创建和删除过程中会出现创建md0重启后变成md127,删除md127重启后又重新出现的状况.在网上搜索了一下,总结如下: 创建: 1. mdad ...
- matlab repmat()
一.B = repmat(A,m,n) 将矩阵 A 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成.B 的维数是 [size(A,1)*m, size(A,2)*n] ...
- 【error】scripts/basic/fixdep: Syntax error: "(" unexpected
前言 第一次安装PCIE驱动的时候容易出现各种问题,总结一下下.. 原因分析 一般情况下,直接make的时候会出现问题. scripts/basic/fixdep: : scripts/basic/f ...
- 10款PHP开源网店系统
在当今经济危机的大环境下,网上购物越来越来吃香,网上开店成本低,快捷方便,出名的电子商务网站有淘宝,拍拍,Ebay或是最新的百度有啊,这些网站都提供开店的机会,如果是想自己搭建购物平台,可以从下面选择 ...
- PDF文本框更改字体大小
在Adobe Acrobat Professional 7.0版本后里单击所插入的文本框,会出现文本框属性,此时只能改文本框的属性,不能修改文本框内的字体大小 要改字体很简单,左键选中要改的文本,按 ...
- web 纯 javascript 的MVC 实现的简单实践
现在javascript是越来越火了,好多javascript框架随之产生,大大简化了我们的开发,一般的开发模式大家是比较喜欢MVC 的model controller view 这种模式 方便了我们 ...
- 批处理(bat)命令学习的一些总结
这篇笔记是我对批处理学习的一些总结,能在系统帮助里找到的内容我就不写了,太偏门的也不写,只写些个人感觉很好用的技巧,大部分属于整理 一.set 篇: 1.set(无开关) set .=test set ...
- js模板引擎之artTemplate
http://www.cnblogs.com/52fhy/p/5393673.html artTemplate 不支持requre.js,悲剧啊,只能用juicer啊 这个还是比较有名的. 简介: a ...