列表

详情


NC235136. 牛牛的方格图

描述

牛牛:“你喜欢玩数独吗?”。
牛牛有一个  的方格图,每个格子都有自己的颜色,第  行第  列格子上的颜色记为 
对于任意两个不同位置的颜色相同的点,我们认为其覆盖了一个以它们为对角线上顶点的矩形中的所有点。
严格来说,一个点  被覆盖,当且仅当存在两个点  和  使得以下四个条件都成立:
    1:
    2:
    3:
    4:
现在牛牛想知道这张方格图中有多少个顶点尚未被覆盖。

输入描述

第一行输入两个数  代表方格图的行数和列数。
接下来 行每行 个数描述了方格图中每个格子上的颜色。
 

输出描述

输出一行一个整数代表答案。

示例1

输入:

3 4
1 3 3 4 
2 3 1 4 
6 3 3 4

输出:

1

说明:

6所在方格未被覆盖。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 489ms, 内存消耗: 27376K, 提交时间: 2023-05-23 16:00:12

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5;
int a[N][N];
int v[N*N][5];
int n,m;
int ans;
int s[N*N];
void modify(int x){
	a[v[x][1]][v[x][2]]++;
	a[v[x][1]][v[x][4]+1]--;
	a[v[x][3]+1][v[x][2]]--;
	a[v[x][3]+1][v[x][4]+1]++;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int x;cin>>x;
			s[x]++;
			if(s[x]==1){
				v[x][1]=i;
				v[x][2]=j;
				v[x][3]=i;
				v[x][4]=j;
			}if(s[x]>=2){
				v[x][1]=min(v[x][1],i);
				v[x][2]=min(v[x][2],j);
				v[x][3]=max(v[x][3],i);
				v[x][4]=max(v[x][4],j);
			}
		}
	}for(int i=1;i<=1e6;i++){
		if(s[i]>=2){
			modify(i);
		}
	}for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
			if(!a[i][j]) ans++;
		}
	}cout<<ans;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 451ms, 内存消耗: 19692K, 提交时间: 2022-09-20 22:32:07

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,M=1e6+10;
struct node {
	int a,b,c,d;
} t[M];
int n,m,p,ans;
int s[N][N];
signed main() {
	cin>>n>>m;
	for(int i = 1; i<=n; i++)
		for(int j = 1; j<=m; j++) {
			int x; cin>>x;
			if(!t[x].a or i>t[x].a) t[x].a=i;
			if(!t[x].b or j>t[x].b) t[x].b=j;
			if(!t[x].c or i<t[x].c) t[x].c=i;
			if(!t[x].d or j<t[x].d) t[x].d=j;
			p=max(p,x);
		}
	for(int i = 1; i<=p; i++) {
		if(!t[i].a or (t[i].a==t[i].c and t[i].b==t[i].d)) continue;
		int a=t[i].a,b=t[i].b,c=t[i].c,d=t[i].d;
		s[c][d]+=1,s[a+1][b+1]+=1,s[a+1][d]-=1,s[c][b+1]-=1;
	}
	for(int i = 1; i<=n; i++)
		for(int j = 1; j<=m; j++) {
			s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
			if(!s[i][j]) ans++;
		}
	cout<<ans;
	return 0;
}

上一题