打卡信奥刷题(1617)用C++实现信奥 P7309 [COCI 2018/2019 #2] Kocka

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 N1000

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1N105 − 1 ≤ L i , R i , U i , D i < N -1 \le L_i,R_i,U_i,D_i \lt N 1Li,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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值