CSP M4 C 宇宙狗的危机

2023-05-16

题意:

描述

在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处,虽然宇宙狗凶神恶煞,但是宇宙狗有一个很可爱的女朋友。

最近,他的女朋友得到了一些数,同时,她还很喜欢树,所以她打算把得到的数拼成一颗树。

这一天,她快拼完了,同时她和好友相约假期出去玩。贪吃的宇宙狗不小心把树的树枝都吃掉了。所以恐惧包围了宇宙狗,他现在要恢复整棵树,但是它只知道这棵树是一颗二叉搜索树,同时任意树边相连的两个节点的gcd(greatest common divisor)都超过1。

但是宇宙狗只会发射宇宙射线,他来请求你的帮助,问你能否帮他解决这个问题。

补充知识:

GCD:最大公约数,两个或多个整数共有约数中最大的一个 ,例如8和6的最大公约数是2。

一个简短的用辗转相除法求gcd的例子:

int gcd(int a,int b){return b == 0 ? a : gcd(b,a%b);}

输入
输入第一行一个t,表示数据组数。

对于每组数据,第一行输入一个n,表示数的个数

接下来一行有n个数​,输入保证是升序的。

输出
每组数据输出一行,如果能够造出来满足题目描述的树,输出Yes,否则输出No。
无行末空格。

输入样例 1

1
6
3 6 9 18 36 108

输出样例 1

Yes

输入样例 2

2
2
7 17
9
4 8 10 12 15 18 33 44 81

输出样例2

No
Yes

在这里插入图片描述


思路:

这道题采用了二叉搜索树作为背景,二叉搜索树的特点是根的左孩子一定比根小,根的右孩子一定比根大,我们可以利用这个性质解题。对于某一个节点而言,他可能的直接相邻的左孩子是比他小的节点,他可能的直接相邻的右孩子是比他大的节点,因此我们设立一个函数

bool Try(int l, int now, int r)

用作递归,参数的l是此探查范围的左边一个位置,r是此探查范围的右边一个位置,now是根的位置,所以这个范围内的数是[a[l+1], a[r-1]],可能作为now的左孩子的是,所有在此范围内且比他小的数字,这些数字的位置在now的左边,l的右边,可能作为now的右孩子的是所有在此范围内且比他大的数字, 这些数字的位置在now的右边,r的左边。此时我们需要分开讨论,使用动态规划的思想,探讨所有他左边的数字行不行,右边的数字行不行。对于now左边的数字,若是有和now的最大公约数大于1的数字,那么此时就构建出了一个新的范围,[a[l+1], a[now - 1]],对于这个数字而言我们需要对他进行和之前的now一样的操作,即对这个数字需要找他可能直接相邻的左孩子,可能直接相邻的右孩子,此时就需要递归调用Try(l, thisnode, now),一直到最后当这个点在此范围内没有左孩子也没有右孩子,则证明这个点往左边找这一部分是正确的,对于右边的操作类似。若是对于过程中的某一个now点,范围内所有比他小的点都无法构成他的左孩子,范围内的所有比他大的点都无法构成他的右孩子,则这一步就是失败的。

若是仅仅这样做会导致复杂度非常高,因为进行了非常多的重复操作,即对于某一范围探查了多次所以有两个需要改进的地方。第一个是每两个点之间的gcd,我们可以事先计算出来,用一个数组存储好,接着调用即可。为了解决范围的重复探查,维护四个数组

bool arrived_l[705][705];  //l,根
bool arrived_r[705][705];  //根,r
bool canStruct_l[705][705]; //l,根
bool canStruct_r[705][705]; //根,r

arrived开头的数组,表示在这一部分的范围内找合适左孩子或是合适的右孩子的操作有没有进行过,而canStruct开头的数组则表示这个操作能不能实现。因此在函数过程中,若是我们想要探查(i,j)范围内的左孩子,就可以先查看arrived_l[i+1][j+1]是否为true,如果已经为true,那么直接用canStruct_l[i+1][j+1]的结果就行,若是为false,就需要进行操作,记得更新这两个数组的内容。这里为什么需要“+1”是因为i是范围内的前一个,当范围从0开始时,i为-1,所以为了应付这种情况,全部右移一位。

Tips:
写完代码后,需要首先自己先查看一遍,不能再犯将"r"写成"l"这种错误了,不能觉得样例过就行了,暴力的分数拿着也很香,希望不要再犯奇怪的错误导致暴力的分都丢了。


代码:

#include<iostream>
#include<math.h>
#include<algorithm>
#include<string.h>
using namespace std;

int a[705];
int gcdArray[705][705];
bool arrived_l[705][705];  //l,根
bool arrived_r[705][705];  //根,r
bool canStruct_l[705][705]; //l,根
bool canStruct_r[705][705]; //根,r

int n;

int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }

bool Try(int l, int now, int r)
{
	if (arrived_l[l + 1][now + 1] && arrived_r[now + 1][r + 1])return (canStruct_l[l + 1][now + 1] && canStruct_r[now+1][r + 1]);

	if (l >= now - 1 && r <= now + 1)
	{
		return true;
	}


	if (!arrived_l[l + 1][now + 1])
	{
		bool judgel = false;
		if (l == now - 1)judgel = true;

		for (int u = l + 1; u < now; u++)
		{
			if (gcdArray[u][now] > 1)
			{
				if (Try(l, u, now))judgel = true;
			}
		}
		arrived_l[l + 1][now + 1] = true;
		canStruct_l[l + 1][now + 1] = judgel;
	}

	if (!arrived_r[now + 1][r + 1])
	{
		bool judger = false;
		if (r == now + 1)judger = true;
		for (int u = now + 1; u < r; u++)
		{
			if (gcdArray[now][u] > 1)
			{
				if (Try(now, u, r))judger = true;
			}
		}
		arrived_r[now + 1][r + 1] = true;
		canStruct_r[now + 1][r + 1] = judger;
	}
	
	return (canStruct_l[l + 1][now + 1] && canStruct_r[now + 1][r + 1]);
}

int main()
{
	int t;
	cin >> t;
	int lo = t;
	while (t-- != 0)
	{
		if (t != (lo - 1))cout << endl;

		memset(arrived_l, false, sizeof(arrived_l));
		memset(arrived_r, false, sizeof(arrived_r));
		memset(canStruct_l, false, sizeof(canStruct_l));
		memset(canStruct_r, false, sizeof(canStruct_r));

		cin >> n;
		for (int i = 0; i < n; i++)
			cin >> a[i];
		for (int i = 0; i < n; i++)
			for (int j = i; j < n; j++)
			{
				gcdArray[i][j] = gcd(a[i], a[j]);
				gcdArray[j][i] = gcdArray[i][j];
			}

		bool judge = false;

		for (int i = 0; i < n && !judge; i++)
		{
			if (Try(-1, i, n))
				judge = true;
		}

		if (judge)cout << "Yes";
		else cout << "No";

	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSP M4 C 宇宙狗的危机 的相关文章

  • 去掉微信浏览器里的放大缩小按钮

    lt meta http equiv 61 34 Content Type 34 content 61 34 text html charset 61 utf 8 34 gt lt meta name 61 34 viewport 34 c
  • 清除SSH秘钥的命令

    重新安装了openmediavault之后在连接就是这样 xff0c 具体的原因是因为主机保存了以前的秘钥 PS C Users qs gt ssh root 64 10 11 12 2 64 64 64 64 64 64 64 64 64
  • HR-XML(可扩展人力资源标准)简介

    HR XML xff08 可扩展人力资源标准 xff09 简介 Flyspace flyspace 64 x263 net 2003 年 12 月 12 日 标准出处 xff1a http www hr xml org 标准简介 xff1a
  • 解决System进程占用80端口的问题

    1 IIS占用80端口 用如下方法可以解决System进程占用80端口的问题 xff1a 打开RegEdit 找到HKEY LOCAL MACHINE SYSTEM CurrentControlSet Services HTTP 找到一个D
  • Win 7, Server 2008 R2最大线程数限制

    最近在做压力测试时发现Win 7 和 Server 2008 R2 系统内线程数设为1500则无法创建线程池 xff0c 深入分析发现32位和64位程序存在很大性能差异 最大线程数 xff1a 32bit xff1a 1450 64bit
  • 算法|找出数组的最大公约数

    力扣第255场周赛题目 刷题链接 https leetcode cn com problems find greatest common divisor of array 题目描述 给你一个整数数组 nums xff0c 返回数组中最大数和
  • 结构体对齐规则

    结构体对齐规则 xff1a 1 第一个成员在于结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数 与 该成员大小的 较小值 3 结构体总大小
  • Snapper转换器的捕捉类型

    原文发布时间 xff1a 2014 09 24 作者 xff1a Tenniwdy 在数据处理中Snapper转换器的作用是很强大的 xff0c 它的各类捕捉类型能针对不同的需求对数据进行处理 在FME Desktop 2014版本中新增了
  • STM32 4x4矩阵键盘初始化及实现多位输入

    目的 xff1a 实现矩阵键盘的多位数据输入 这里以两位数据为例 引脚初始化PC0 PC7 void Key Config GPIO InitTypeDef GPIO InitStructure RCC APB2PeriphClockCmd
  • CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

    试题内容请前往CCF官网查看 xff1a CCF CSP计算机软件能力认证考试 http 118 190 20 162 home page 阅读本题解前 xff0c 您应当了解下列知识 xff1a 线段树 教程C 43 43 标准库 xff
  • 在 VirtualBox 中构建 Debian11 虚拟电脑

    文章目录 前言一 准备工作和Debian简介二 新建虚拟电脑三 安装 Debian11四 Debian11系统环境配置配置光盘软件镜像源配置国内镜像软件源控制台鼠标支持 安装虚拟机增强功能SSH 接入国际化和本地化配置网卡 结语 前言 介绍
  • 【华为机试真题 Python】 放苹果

    目录 题目描述 输入 输出 示例 参考代码 题目描述 把m个同样的苹果放在n个同样的盘子里 允许有的盘子空着不放 问共有多少种不同的分法 注意 如果有7个苹果和3个盘子 5 1 1 和 1 5 1 被视为是同一种分法 数据范围 0 m 10
  • keil5 显示 No target connected

    keil5 显示 No target connected 第一 xff0c 确认上电是否正常 xff0c 板子上有电源指示灯 xff1b 就是那个红色的指示灯 第二 xff1a 长按核心板上的复位键不要松开 找到Debug xff0c 确认
  • Debian系统安装中文包

    相对于Ubuntu系统 xff0c debian系统性对来说较为原始 xff0c 不能像Ubuntu一样一键设定为中文 xff0c 这样就必须自行设定 xff1a 1 安装aptitude xff1a sudo apt span class
  • 解决Linux(Ubuntu)系统下复制粘贴文件权限不够的问题

    首先是ctrl 43 alt 43 t 打开一个终端 运行命令 sudo nautilus 就可以打开一个具有管理员权限的文件管理器 xff0c 然后就可以在不切换到管理员的条件下拷贝文件
  • 解决开机出现“CLIENT MAC ADDR”的问题

    开机自检后 xff0c 系统会出现网卡配置的提示 xff0c 此时按Shift 43 F10组合键可进入配置页面 xff0c 如果不按该组合键 xff0c 几秒后则跳入下一页面 xff0c 这里会停留一段时间 xff0c 一般是一二十秒的样
  • iOS之性能优化·提高App的编译速度

    一 前言 经过多年的开发和迭代 xff0c 我相信很多的 iOS 项目代码已经达到几十万行甚至上百万行的规模 xff0c 所使用的 Pod 库的数量可以达到几十个甚至上百个 xff0c App Store 安装包也变得越来越大 xff0c
  • iOS之性能优化·优化App界面的渲染与流畅度

    一 界面渲染流程 渲染流程分析 计算机中的显示过程通常是通过 CPU GPU 显示器协同工作来将图片显示到屏幕上 xff0c 如下图所示 xff1a 苹果为了解决图片撕裂的问题使用了 VSync 43 双缓冲区的形式 xff0c 就是显示器
  • 图像处理:傅里叶变换

    0 引言 在之前的博客 图像增强 xff0c 傅里叶变换 xff08 OpenCV 中都有用到过傅里叶变换 xff0c 但一直都不是特别理解 xff0c 现系统地学习一下 先来看一个视频 傅里叶级数与傅立叶变换 xff0c 我们了解到任何周
  • 从键盘输入10个整数,判断并输出10个数中的最大值和平均值

    include lt graphics h gt include lt conio h gt include lt stdio h gt int main int a 61 0 b 61 0 c 61 0 i 61 1 n max 61 0

随机推荐

  • ubuntu虚拟机忘记开机密码,重置密码

    有时我们会忘记ubuntu虚拟机的开机密码 xff0c 这是候需要我们重置密码 xff0c 步骤如下 xff1a 1 打开虚拟机 xff0c 在虚拟机启动界面出现时 xff0c 鼠标点击虚拟机启动界面 xff0c 将键盘输入定向到虚拟机 x
  • 结构体数组操作+文件读写

    一 1 声明了该结构体就声明了结构体内所有成员 include lt stdio h gt typedef struct stuInfo char name int age int num Student int main int argc
  • CEF中JavaScript与C++交互

    在CEF里 xff0c JS和Native xff08 C C 43 43 xff09 代码可以很方便的交互 xff0c 这里https bitbucket org chromiumembedded cef wiki JavaScriptI
  • 阿里云网盘内测网址

    阿里云Teambition网盘内测申请地址 这个网盘还没有开放 xff0c 想要体验的话可以申请 xff0c 通过后 xff0c 获得体验资格 网址 xff1a https form teambition net f CjQetM x fi
  • Python 创建安装包

    Version usr bin env python3 coding utf 8 64 Author forward huan 64 Time 2022 07 14 23 05 64 Description import json impo
  • IOS UITableViewCell高度自适应的那些事

    好啦 xff0c 这是一个老生常谈的问题 真的 xff0c 有时候把人气得想去搞安卓 xff0c 安卓就没得这码子事 xff5e 方案有很多 xff0c 我这里提供三种方案 其实每种自适应高度的方法都有比较适合自己的情景 xff0c 比如c
  • Sublime Text 最新注册码

    Sublime Text 最新注册码 Sublime 更新后 xff0c 很多验证码都失效了 收集了一些在 2017 09 14 测试有效的注册码 xff0c 适用于 xff1a Sublime Text 2 3 xff0c Build 2
  • 群晖NAS变成TimeMachine时间机器完成Mac备份

    如果有一台群晖Nas xff0c 那么我们可以很方便的利用他完成Mac系统的自动备份 我的群晖在路由器后面 xff0c 所以当我不再家的时候备份 xff0c 则需要使用vpn连接到群晖 接下来让我们实践出真知吧 1 在群晖nas中设置一个同
  • 如何生成ssh key,以及repo init 遇到的无法检查签名:找不到公钥 问题

    repo init 遇到 无法检查签名 找不到公钥 的问题 源文章 xff1a http blog csdn net njuitjf article details 38386941 方法一 xff1a 出现此问题是repo版本不对的问题
  • 选数问题 Gym - 270437C

    题意 xff1a 给定n个正整数 xff0c 从中选取K个数 xff0c 保证这K个数的和是S 求有多少种选择的方法 Input 第一行输入一个整数T T lt 61 100 xff0c 表示有T个测试样例 对于每个例子 xff0c 有两行
  • 掌握魔法的东东II Gym - 101510B

    题意 xff1a 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 x
  • 传递闭包 Floyd算法

    题意 xff1a 众所周知 xff0c TT 有一只魔法猫 这一天 xff0c TT 正在专心致志地玩 猫和老鼠 游戏 xff0c 然而比赛还没开始 xff0c 聪明的魔法猫便告诉了 TT 比赛的最终结果 TT 非常诧异 xff0c 不仅诧
  • csp m2 咕咕东的奇妙序列 二分

    题意 xff1a 题目描述 咕咕东 正在上可怕的复变函数 xff0c 但对于稳拿A Plus的 咕咕东 来说 xff0c 她早已不再听课 xff0c 此时她在睡梦中 突然想到了一个奇怪的无限序列 xff1a 112123123412345
  • A - 咕咕东的目录管理器

    题意 xff1a 样例输入 xff1a span class token number 1 span span class token number 22 span MKDIR dira CD dirb CD dira MKDIR a MK
  • ssh密钥对

    SSH密钥 1 生成ssh密钥对 不要私钥密码 连续回车 win git ssh keygen t rsa b 4096 C 34 yourname or youremail 34 34 qs 64 Dell MINGW64 span cl
  • C - 公园坐椅子

    题意 xff1a SDUQD 旁边的滨海公园有 x 条长凳 第 i 个长凳上坐着 a i 个人 这时候又有 y 个人将来到公园 xff0c 他们将选择坐在某些公园中的长凳上 xff0c 那么当这 y 个人坐下后 xff0c 记k 61 所有
  • week12 hw 必做题1,2

    题意 xff1a 给出n个数 xff0c zjm想找出出现至少 n 43 1 2次的数 xff0c 现在需要你帮忙找出这个数是多少 xff1f Input 本题包含多组数据 xff1a 每组数据包含两行 第一行一个数字N 1 lt 61 N
  • week13 hw必做1,2

    题意 xff1a 这一天 xff0c TT 遇到了一个神秘人 神秘人给了两个数字 xff0c 分别表示 n 和 k xff0c 并要求 TT 给出 k 个奇偶性相同的正整数 xff0c 使得其和等于 n 例如 n 61 10 xff0c k
  • week14限时模拟 猫睡觉问题 HDU - 3700

    题意 xff1a 众所周知 xff0c TT家里有一只魔法喵 这只喵十分嗜睡 一睡就没有白天黑夜 喵喵一天可以睡多次 xff01 xff01 每次想睡多久就睡多久 喵睡觉的时段是连续的 xff0c 即一旦喵喵开始睡觉了 xff0c 就不能被
  • CSP M4 C 宇宙狗的危机

    题意 xff1a 描述 在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处 xff0c 虽然宇宙狗凶神恶煞 xff0c 但是宇宙狗有一个很可爱的女朋友 最近 xff0c 他的女朋友得到了一些数 xff0c 同时 xff0c 她还很喜欢树 xf