牛客网多校第7场 J Sudoku Subrectangles 【构造】
题目:戳这里
题意:给一个n*m的矩阵,里面由a~z及A~Z构成,问有多少个子矩阵满足任意一行或一列中都没有相同的字母。
解题思路:左上角和右下角两点可以确定一个矩阵。可以先预处理出来每个点作为一个矩阵的右下角,向左和向上的最长值。然后遍历每个点是右下角的情况,计算该点为右下角时,能构成多少个矩阵。计算方法为:
1.设右下角为(i,j),它向左的最长值为r[i][j],向上最长之为c[i][j],设左上角为(x,y)。
2.遍历j~j-r[i][j]+1,维护最小值minn[]。
3.根据minn[]数组和c[][]数组,找到符合条件的左上角,计入答案。
这三步操作的原因是,一个符合条件的左上角(x,y),要满足矩形底边上所有点的i-c[i][k]+1>=x,右边上所有点的j-r[k][j]+1>=y。
代码思路比较绕,写的时候得静下心。
附ac代码:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 #include <string>
6 #include <cmath>
7 #include <map>
8
9 using namespace std;
10 typedef long long ll;
11 const int maxn = 1e3 + 10;
12 char st[maxn][maxn];
13 int r[maxn][maxn], c[maxn][maxn];
14 int pos[maxn];
15 int minn[maxn];
16 const int inf = 0x3f3f3f3f;
17 int main()
18 {
19 int n, m;
20 scanf("%d %d", &n, &m);
21 for(int i = 1; i <= n; ++i)
22 {
23 scanf("%s", st[i] + 1);
24 }
25 int len = 0;
26 int cnt = 0;
27 for(int i = 1; i <= n; ++i)
28 {
29 memset(pos, 0, sizeof(pos));
30 for(int j = 1; j <= m; ++j)
31 {
32 len = st[i][j] - 'A';
33 r[i][j] = j - pos[len];
34 r[i][j] = min(r[i][j], r[i][j - 1] + 1);//避免abba时,无法更新pos
35 pos[len] = j;
36 }
37 }
38 for(int j = 1; j <= m; ++j)
39 {
40 memset(pos, 0, sizeof(pos));
41 for(int i = 1; i <= n; ++i)
42 {
43 len = st[i][j] - 'A';
44 c[i][j] = i - pos[len];
45 c[i][j] = min(c[i][j], c[i - 1][j] + 1);//同上
46 pos[len] = i;
47 }
48 }
49 ll ans = 0;
50 for(int i = 1; i <= n; ++i)
51 {
52 memset(minn, inf, sizeof(minn));
53 for(int j = 1; j <= m; ++j)
54 {
55 for(int k = j; k >= j - r[i][j] + 1; --k)
56 minn[k] = min(minn[k + 1], c[i][k]);//(i,k)点能取到的最远列
57
58 int len = j - r[i][j] + 1;
59
60 for(int k = i; k >= i - c[i][j] + 1; --k)
61 {
62 while(minn[len] < i - k + 1 || r[k][j] < j - len + 1)//倘若点(i,j)的minn值取不到k或(k,j)本身取不到minn,则说明len不符合条件
63 {
64 ++ len;
65 if(len > j) break;
66 }
67 if(len > j) break;
68 ans += j - len + 1;
69 // printf("%lld ans\n", ans);
70 }
71 //printf("%d ans\n",ans);
72 }
73 }
74 printf("%lld\n", ans);
75 return 0;
76 }
牛客网多校第7场 J Sudoku Subrectangles 【构造】的更多相关文章
- 牛客网多校第4场 J Hash Function 【思维+并查集建边】
题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...
- 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)
链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...
- 牛客网多校第3场C-shuffle card 平衡树或stl(rope)
链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...
- 牛客网多校第3场Esort string (kmp)
链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...
- 牛客网多校赛第九场A-circulant matrix【数论】
链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校训练第二场D Kth Minimum Clique
链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...
- 牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...
- 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】
题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...
- 牛客网多校第4场 A.Ternary String 【欧拉降幂】
题目:戳这里 学习博客:戳这里 欧拉函数的性质: ① N是不为0的整数.φ(1)=1(唯一和1互质的数就是1本身) ② 除了N=2,φ(N)都是偶数. ③ 小于N且与N互质的所有数的和是φ(n)*n/ ...
随机推荐
- 通过js给某个标签添加内容或者删除标签
添加内容 //先保存div中原来的html var tag = document.getElementById("tag").innerHTML; //构造新的内容 var cou ...
- 小程序map学习:使用map获取当前位置并显示出来
在小程序开发的过程中,我碰到过一个做map的需求,在我开发的时候我碰到了一些问题,这里总结出来,给大家一些解决方法. 简易小程序dome下载 代码片段分享: js部分: var amapFile = ...
- CNN可视化技术总结(一)--特征图可视化
导言: 在CV很多方向所谓改进模型,改进网络,都是在按照人的主观思想在改进,常常在说CNN的本质是提取特征,但并不知道它提取了什么特征,哪些区域对于识别真正起作用,也不知道网络是根据什么得出了分类结果 ...
- uniapp根据登录用户的角色动态的改变tabBar的数量和内容
此文章借鉴于https://blog.csdn.net/fuyuumiai/article/details/109746357,在此基础上修改小部分内容,适用于我这种uniapp小白 介绍: 现在我们 ...
- ADB 基本命令
ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列号: adb get-serialno 查看连接计算机的设备: adb devices 重启机器: adb reboot 重启到bootl ...
- monitor a local unix domain socket like tcpdump
Can I monitor a local unix domain socket like tcpdump? - Super User https://superuser.com/questions/ ...
- WebRTC 泄漏真实 IP 地址
WebRTC(网页即时通信,Web Real-Time Communication) 它允许浏览器内进行实时语音或视频对话,而无需添加额外的浏览器扩展.包括 Chrome.Firefox.Opera. ...
- udp聊天器
import socket def send_msg(udp_socket): """获取键盘数据,并将其发送给对方""" # 1. 从键盘 ...
- mysql修改最大连接数
root@localhost ~]# nano /etc/my.cnf编辑my.cnf在[mysqld]中加入:set-variable=max_connections=1000 更改 MySQL 在 ...
- SQL系列总结——基础篇(二)
表达式:是符号与运算符的组合,一个常量,变量.列或标量函数就是一个简单的表达式,复杂的表达式由两个或更多的简单表达式通过运算符连接起来组成.运算符同样的遵循优先级的原则.作用,让SQL的 ...