P7309 [COCI 2018/2019 #2] Kocka
题目背景
在儿童游乐场里,编者被一个由金属横杠组成的立方体所吸引,于是他想出了一个有趣的问题。这里是二维的版本。
题目描述
给定一个 N × N N \times N N×N 的矩阵。有些区域被堵塞,而有些区域是空白的。在观察的过程中,他从 4 4 4 个方向对该矩阵进行观察。先从左侧开始,记录下每一行的第一个堵塞处前有几排是空出的。如果没有堵塞,则记下 − 1 -1 −1。接着他如法炮制,分别从右侧、上方和下方进行观察并记录。
这样,他总共写下了 4 N 4N 4N 个数字,其中每个方位均写下了 N N N 个数字。然而,未知的恶棍摧毁了矩阵,他所剩的只有他写下的数字。
编者想问你他写的数字是否存在错误,即是否可以通过这些数字还原出一个 N × N N \times N N×N 的矩阵。
输入格式
第一行输入正整数 N N N,表示矩阵的规模。
第二行包含 N N N 个整数 L i L_i Li,表示从左侧观察所记下的数字。
第三行包含 N N N 个整数 R i R_i Ri,表示从右侧观察所记下的数字。
第四行包含 N N N 个整数 U i U_i Ui,表示从上方观察所记下的数字。
第五行包含 N N N 个整数 D i D_i Di,表示从下方观察所记下的数字。
输出格式
如果给定的数字可以还原出一个
N
×
N
N \times N
N×N 的矩阵,则输出 DA
,否则输出 NE
。
输入输出样例 #1
输入 #1
3
-1 2 0
-1 0 1
2 2 1
0 0 1
输出 #1
DA
输入输出样例 #2
输入 #2
3
-1 0 1
-1 2 1
-1 2 -1
1 0 -1
输出 #2
NE
说明/提示
样例 1 解释
数据规模与约定
对于 40 % 40\% 40% 的数据, N ≤ 1000 N \le 1000 N≤1000。
对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1≤N≤105, − 1 ≤ L i , R i , U i , D i < N -1 \le L_i,R_i,U_i,D_i \lt N −1≤Li,Ri,Ui,Di<N。
说明
本题分值按 COCI 原题设置,满分 70 70 70。
题目译自 COCI2018-2019 CONTEST #2 T2 Kocka。
C++实现
#include<bits/stdc++.h>
#define rep(i, l, r) for (int i = (l); i <= (r); i++)
using namespace std;
const int N = 1e5+15;
int n;
int l[N], r[N], u[N], d[N];
signed main() {
scanf("%d", &n);
rep(i, 1, n) scanf("%d", &l[i]);
rep(i, 1, n) scanf("%d", &r[i]);
rep(i, 1, n) scanf("%d", &u[i]);
rep(i, 1, n) scanf("%d", &d[i]);
rep(i, 1, n) {
if (l[i] != r[i] && (l[i] == -1 || r[i] == -1)) {
printf("NE");
return 0;
}
if (u[i] != d[i] && (u[i] == -1 || d[i] == -1)) {
printf("NE");
return 0;
}
if (l[i] + r[i] >= n) {
printf("NE");
return 0;
}
if (u[i] + d[i] >= n) {
printf("NE");
return 0;
}
if (u[l[i] + 1] > i && d[l[i] + 1] > (n - i + 1)) {
printf("NE");
return 0;
}
}
printf("DA");
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容