题解:CF1981C(Turtle and an Incomplete Sequence)

题解:CF1981C(Turtle and an Incomplete Sequence)

Part 1:题意理解

  • 地址链接:CF、洛谷。
  • 题面翻译:给定一个长度为 n n n 的序列 a a a,其中有一些元素未知,用 − 1 -1 1 表示,现在要将数组 a a a 补充完整,即将 a a a 中所有的 − 1 -1 1 替换成一个小于等于 1 0 9 10^9 109正整数,使得对于任意一个 1 ≤ i < n 1\leq i<n 1i<n,都有 a i = ⌊ a i + 1 2 ⌋ a_i=\left\lfloor\frac{a_{i+1}}{2}\right\rfloor ai=2ai+1 或者 a i + 1 = ⌊ a i 2 ⌋ a_{i+1}=\left\lfloor\frac{a_i}{2}\right\rfloor ai+1=2ai。如果存在合法的方案,输出填充后的数组,否则输出 − 1 -1 1
  • 数据范围: n ≤ 2 ⋅ 1 0 5 n\leq2\cdot10^5 n2105,只能接受线性算法

Part 2:算法分析

  • 典型构造题。
  • 首先特判,如果 a a a 中所有元素都未知,那么就 1 1 1 2 2 2 交替输出。
  • 由于前缀后缀 − 1 -1 1 都很好处理,并且对中间没有影响,先将他们特别处理。具体的,以前缀为例,假设 a 1 a_1 a1 a i a_i ai 均为 − 1 -1 1,且 a i + 1 a_{i+1} ai+1 不是 − 1 -1 1,是已知的,那么将 1 1 1 i i i 中所有与 i + 1 i+1 i+1 奇偶性相同的赋值为 a i + 1 a_{i+1} ai+1,其余赋值为 a i + 1 × 2 a_{i+1}\times 2 ai+1×2
  • 对于中间,每个连续的 − 1 -1 1 组成的独立的,可分别处理。假设现在处理的是 a u a_u au a v a_v av 这个段,我们的目标就是通过 v − u + 2 v-u+2 vu+2 次乘 2 2 2、除以 2 2 2 的操作让 a u − 1 a_{u-1} au1 变成 a v + 1 a_{v+1} av+1。也就是说 a u − 1 ≠ − 1 a_{u-1}\neq-1 au1=1 a u a_u au a v a_v av 都是 − 1 -1 1 a v + 1 ≠ − 1 a_{v+1}\neq-1 av+1=1。根据题面分析,其实说 a i a_i ai a i + 1 a_{i+1} ai+1 满足条件,实际上就是说它们在由 1 1 1 n n n 编号的节点组成的完全二叉树上是相邻的。因此, a u − 1 a_{u-1} au1 通过一些操作变成 a v + 1 a_{v+1} av+1,就相当于在这棵完全二叉树上找到一个从 a u − 1 a_{u-1} au1 走到 a v + 1 a_{v+1} av+1长度等于 v − u + 2 v-u+2 vu+2 的路径。
  • 如何找这条路径呢?显然,只要找出两个节点的 LCA,按照 a u − 1 a_{u-1} au1 到 LCA 再到 a v + 1 a_{v+1} av+1 的顺序走就能得出最短的一条路径。至于怎么使它加长,就可以直接在某个点上,比如 LCA,不断地乘 2 2 2、除以 2 2 2 就可以了。当然,如果奇偶性不对,或者最短的长度也不够,自然不行。
  • 但是如何实现呢?有两个指针分别指向这段未知的元素最左侧最右侧仍旧没有填充的位置。每一次,如果某一侧最后一个已经填充完成的数较大,就让对应侧的指针对应的元素赋值为它除以 2 2 2。如果两侧相等,就让其中一个能除以二就除以二;不能除以二,也就是说对应的已经处理完的是 1 1 1,就乘二。最后判断两个方向最后一个赋值的是否满足条件即可。

Part 3:代码实现

#include <bits/stdc++.h>
#define N 220000
using namespace std;
int t, n, a[N];
int s, lst, u, v;
bool flag;
int main() {scanf("%d", &t);while (t--) {scanf("%d", &n);s = 0;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);if (a[i] == -1) {s++;}}flag = false;for (int i = 2; i <= n; i++) {if (a[i - 1] != -1 && a[i] != -1 && a[i - 1] != a[i] / 2 && a[i] != a[i - 1] / 2) {flag = true;break;}}if (flag == true) {printf("-1\n");continue;}if (s == n) {for (int i = 1; i <= n; i++) {if (i % 2 == 0) {printf("1 ");} else {printf("2 ");}}printf("\n");} else {lst = -1;for (int i = 1; i <= n; i++) {if (a[i] != -1) {lst = i;break;}}for (int i = lst - 1; i >= 1; i--) {if (i % 2 == lst % 2) {a[i] = a[lst];} else {a[i] = a[lst] * 2;}}lst = -1;for (int i = n; i >= 1; i--) {if (a[i] != -1) {lst = i;break;}}for (int i = lst + 1; i <= n; i++) {if (i % 2 == lst % 2) {a[i] = a[lst];} else {a[i] = a[lst] * 2;}}lst = -1;flag = true;for (int i = 1; i <= n; i++) {if (a[i] == -1) {if (lst == -1) {lst = i;}if (a[i + 1] != -1) {u = lst;v = i;while (u <= v) {if (a[u - 1] > a[v + 1]) {a[u] = a[u - 1] / 2;u++;} else if (a[u - 1] < a[v + 1] ){a[v] = a[v + 1] / 2;v--;} else {if (a[u - 1] == 1) {a[u] = a[u - 1] * 2;} else {a[u] = a[u - 1] / 2;}u++;}}if (a[u] != a[v] / 2 && a[v] != a[u] / 2) {flag = false;break;}lst = -1;}}}if (flag == false) {printf("-1\n");} else {for (int i = 1; i <= n; i++) {printf("%d ", a[i]);}printf("\n");}}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/367641.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue组件深入介绍之插槽

了解插槽之前请先了解vue组件基础及注册 Vue2官网介绍 Vue3官网介绍 1、vue2插槽介绍 在2.6.0中&#xff0c;具名插槽和作用域插槽引入了一个新的统一语法&#xff08;v-slot指令&#xff09;。它将取代slot和slot-scope&#xff1b; Vue 实现了一套内容分发的 API&#xf…

奇瑞被曝强制加班,“896”成常态且没有加班费

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7 月 2 日消息&#xff0c;一位认证为“奇瑞员工”的网友近期发帖引发热议&#xff0c;奇瑞汽车内部存在强制加班行为&#xff0c;每周加班时长需大于 20 小时并且没有加班费&#xff0c;仅补贴 10 元…

elementui中@click短时间内多次触发,@click重复点击,做不允许重复点击处理

click快速点击&#xff0c;发生多次触发 2.代码示例&#xff1a; //html<el-button :loading"submitLoading" type"primary" click"submitForm">确 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按钮 */sub…

昇思25天学习打卡营第6天|数据变换 Transforms

学习目标&#xff1a;熟练掌握数据变换操作 熟悉mindspore.dataset.transforms接口 实践掌握常用变换 昇思大模型平台学习心得记录&#xff1a; 一、关于mindspore.dataset.transforms 1.1 变换 mindspore.dataset.transforms.Compose将多个数据增强操作组合使用。 mindspo…

OBD诊断(ISO15031) 04服务

文章目录 功能简介ISO 9141-2、ISO 14230-4和SAE J1850的诊断服务定义1、清除/重置与排放相关的诊断信息请求消息定义2、请求与排放相关的DTC响应消息定义3、报文示例 ISO 15765-4的诊断服务定义1、请求与排放相关的DTC请求消息定义2、请求与排放相关的DTC响应消息定义3、否定响…

信息安全体系架构设计

对信息系统的安全需求是任何单一安全技术都无法解决的&#xff0c;要设计一个信息安全体系架构&#xff0c;应当选择合适的安全体系结构模型。信息系统安全设计重点考虑两个方面&#xff1b;其一是系统安全保障体系&#xff1b;其二是信息安全体系架构。 1.系统安全保障体系 安…

linux下Java11无jre文件夹的问题

项目升级需要更高级的Java版本&#xff0c;于是下载了jdk-11.0.22_linux-x64_bin.tar.gz&#xff0c;解压后jdk-11.0.22下没有jre&#xff0c;导致eclipse下“build path”无法加载jre。 Java11以上版本不在提供jre&#xff0c;Java11安装后&#xff0c;需要如下处理&#xff1…

可充电纽扣电池ML2032充电电路设计

如图&#xff0c;可充电纽扣电池ML2032充电电路设计。 图中二极管是为了防止电流倒灌&#xff0c; 电阻分压出3.66v&#xff0c;再减掉二极管压降&#xff08;约0.4v)得3.26V&#xff0c;加在电池正负极充电。 随着电池电量的积累&#xff0c;充电电流逐步减小&#xff0c;极限…

探索迁移学习:通过实例深入理解机器学习的强大方法

探索迁移学习&#xff1a;通过实例深入理解机器学习的强大方法 &#x1f341;1. 迁移学习的概念&#x1f341;2. 迁移学习的应用领域&#x1f341;2.1 计算机视觉&#x1f341;2.2 自然语言处理&#xff08;NLP&#xff09;&#x1f341;2.3 医学图像分析&#x1f341;2.4 语音…

新手教学系列——慎用Flask-SQLAlchemy慢日志记录

在使用 Flask-SQLAlchemy 开发应用时,了解和避免潜在的问题是非常重要的。特别是在常驻进程和循环执行任务的场景下,慢查询记录功能(SQLALCHEMYRECORDQUERIES)可能会引发严重的内存泄漏问题。本文将详细介绍这个问题,并提供解决方案,帮助你在开发过程中避免掉入这些陷阱。…

Java开源ERP系统Axelor汉化方法初探

Axelor简介 汉化过程介绍 定义语言和本地化 导出多语言记录 导入翻译 验证翻译 调整翻译 Axelor简介 2024年6月份Axelor ERP发布了8.1版本&#xff0c;适配JDK11及PostgreSQL12及以上版本&#xff08;7及以前版本适配JDK8及PostgreSQL10&#xff09;数据库。v8版本较之前…

Oracle - 数据库打补丁实践

原文&#xff1a;https://www.cnblogs.com/ddzj01/p/12097467.html 一、概述 本文将介绍如何给oracle数据库打最新补丁&#xff0c;数据库版本为11.2.0.4单实例&#xff0c;操作系统为redhat6.5 二、下载相关升级包 1. 登录MOS&#xff0c;查阅(ID 2118136.2)&#xff0c;下载…

TDD测试驱动开发

为什么需要TDD&#xff1f; 传统开发方式&#xff0c;带来大量的低质量代码&#xff0c;而代码质量带来的问题&#xff1a; 1.在缺陷的泥潭中挣扎 开发长时间投入在缺陷的修复中&#xff0c;修复完依赖测试做长时间的回归测试 2.维护困难&#xff0c;开发缓慢 比如重复代码&am…

Stm32的DMA的学习

一&#xff0c;介绍 二&#xff0c;DMA框图 三&#xff0c;DMA通道 四&#xff0c;相关HAL库函数 五&#xff0c;配置DMA 六&#xff0c;Stm32CubeMX配置 【13.1】减少CPU传输负载 DMA直接存储器访问—Kevin带你读《STM32Cube高效开发教程基础篇》_哔哩哔哩_bilibili

sideloadly 苹果自签和sidestore手机续签ipa记录

sideloadly 地址&#xff1a;https://sideloadly.io/#download 直接安装对应系统软件&#xff0c;然后吧ipa 拖到里面续签&#xff0c;缺点每7天需要电脑续签 如果续签保留数据需要对应的位置开启 enable file sharing 勾选 和 bundle id 修改 注意的地方需要电脑和手机appi…

echarts-wordcloud:打造个性化词云库

前言 在当今信息爆炸的时代&#xff0c;如何从海量的文本数据中提取有用的信息成为了一项重要的任务。词云作为一种直观、易于理解的数据可视化方式&#xff0c;被广泛应用于文本分析和可视化领域。本文将介绍一种基于 echarts-wordcloud 实现的词云库&#xff0c;通过其丰富的…

06-java基础——集合的复习

集合的体系结构 集合主要分为两类&#xff1a; 单列集合双列集合 一、单列集合 list系列集合&#xff1a;添加的元素是有序、可重复、有索引的。 有序&#xff1a;指的是存和取的顺序是一致的 set系列集合&#xff1a;添加的元素是无序、不可重复、无索引的。 collection&…

Python爬虫实战案例——王者荣耀皮肤抓取

大家好&#xff0c;我是你们的老朋友——南枫&#xff0c;今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩&#xff0c;直接上代码&#xff1a; 导入我们需要使用到的&#xff0c;也是唯一用到的库&#xff1a; 我们要抓取皮肤其…

统计信号处理基础 习题解答11-11

题目 考虑矢量MAP估计量 证明这个估计量对于代价函数 使贝叶斯风险最小。其中&#xff1a;, &#xff0c;且. 解答 贝叶斯风险函数&#xff1a; 基于概率密度的非负特性&#xff0c;上述对积分要求最小&#xff0c;那就需要内层积分达到最小。令内层积分为&#xff1a; 上述积…

【SkiaSharp绘图12】SKCanvas方法详解(一)清空、裁切区域设置、连接矩阵、注释、弧与扇形、图集、九宫格绘图、圆

文章目录 SKCanvas 方法Clear 清空ClipPath/ClipRect/ClipRegion/ClipRoundRect 设置裁切区域Concat 连接矩阵DrawAnnotation绘制注释DrawArc绘制椭圆弧、扇形DrawAtlas绘制图集(一个图像、多个区域、多个缩放、一次绘制&#xff09;DrawBitmap绘制图像DrawBitmapNinePatch九宫…