牛客网多校第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/ ...
随机推荐
- 为什么会有 AtomicReference ?
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 我们之前了解过了 AtomicInteger.Ato ...
- 1、kubernetes简介
Kubernetes简介 文档信息 中文官网:https://kubernetes.io/zh 中文社区:https://www.kubernetes.org.cn/ Kubernetes是容器集群管 ...
- 亲测可用!免费下载QQ音乐大部分资源!
优化后亲测可用!免费下载QQ音乐大部分资源 通知 时间问题 博客园这边暂时停更要下载的去GitHub或者90盘 GitHub项目地址 https://github.com/TotoWang-hhh/m ...
- 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾
https://mp.weixin.qq.com/s/67NvEVljnU-0-6rb7MWpGw 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾 原创 蚂蚁金 ...
- Win10家庭版Hyper-V出坑(完美卸载,冲突解决以及Device Guard问题)
本文链接:https://blog.csdn.net/hotcoffie/article/details/85043894 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附 ...
- Trie 前缀树或字典树 确定有限状态自动机
https://zh.wikipedia.org/wiki/Trie 应用 trie树常用于搜索提示.如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能.[ ...
- 从输入URL到页面展示,这中间都发生了什么?
前言 在浏览器里,从用户输入URL到页面展示,这中间都发生了什么?这是一道非常经典的面试题.这里边涉及很多知识点,比如:网络协议.页面渲染.操作系统等.所以这是很好很全面的考察一个前端的知识.下面我将 ...
- 洛谷 p3391
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- Cmder的findstr问题
在环境变量中加入C:\windows\system32即可
- (一)在Spring Boot应用启动之后立刻执行一段逻辑
在Spring Boot应用启动之后立刻执行一段逻辑 1.CommandLineRunner 2.ApplicationRunner 3.传递参数 码农小胖哥:如何在Spring Boot应用启动之后 ...