[NOIP 2024 模拟2]矩阵学说

[NOIP 2024 模拟2]矩阵学说

题意

给出 nm 列的矩阵,第 i 行第 j 列的元素为 ai,j,找出满足以下条件的三元组 (i,j,x) 的 数量:

  1. 1in, 1jm, 1xmin(ni+1,mj+1)
  2. 矩阵的左上角 (i,j) 到右下角 (i+x1,j+x1) 恰好含 k 个不同的整数。

1ai,j100 1n,m2000

思路

考虑求出包含数的种类 k 的个数和 <k 的个数,相减得到答案。

枚举左上角,矩阵包含数的种类个数显然单调不递减,二分边长即可。

快速求区间数的种类可以用二维 ST 表加 bitset。

时间复杂度:O(nmlogmin(n,m))

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1505;
int n, m, k, a[N][N], lg[N];
bitset <100> st[N][N][12];
void init() {
	lg[1] = 0;
	for (int i = 2; i <= n; i ++) lg[i] = lg[i >> 1] + 1; 
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			st[i][j][0][a[i][j] - 1] = 1;
	for (int l = 1; l <= 14; l ++) 
		for (int i = 1; i <= n && i + (1 << l) - 1 <= n; i ++) 
			for (int j = 1; j <= m && j + (1 << l) - 1 <= m; j ++) 
				st[i][j][l] = st[i][j][l - 1] | st[i + (1 << (l - 1))][j][l - 1] | st[i][j + (1 << (l - 1))][l - 1] | st[i + (1 << (l - 1))][j + (1 << (l - 1))][l - 1];
}
int query(int x, int y, int l) {
	int K = lg[l];
	int X = x + l - 1, Y = y + l - 1;
	return (st[x][y][K] | st[X - (1 << K) + 1][Y - (1 << K) + 1][K] | st[X - (1 << K) + 1][y][K] | st[x][Y - (1 << K) + 1][K]).count(); 
	return 0;
}
int calc(int num) {
	int res = 0;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			int l = 1, r = min(n - i + 1, m - j + 1), pos = 0;
			while (l <= r) {
				int mid = (l + r) >> 1;
				if (query(i, j, mid) <= num) pos = mid, l = mid + 1;
				else r = mid - 1;
			}
			res += pos;
		}
	}
	return res;
}
void solve() {
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i ++) 
		for (int j = 1; j <= m; j ++) 
			cin >> a[i][j];
	init();
	cout << calc(k) - calc(k - 1) << "\n";
}
signed main() {
	freopen("mar.in", "r", stdin);
	freopen("mar.out", "w", stdout);
	int Case = 1;
//	cin >> Case;
	while (Case --)
		solve();
	return 0;
}
/*
2 3 4
1 2 3
4 5 6
*/
posted @   maniubi  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示