题解: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 1≤i<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 n≤2⋅105,只能接受线性算法。
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 v−u+2 次乘 2 2 2、除以 2 2 2 的操作让 a u − 1 a_{u-1} au−1 变成 a v + 1 a_{v+1} av+1。也就是说 a u − 1 ≠ − 1 a_{u-1}\neq-1 au−1=−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} au−1 通过一些操作变成 a v + 1 a_{v+1} av+1,就相当于在这棵完全二叉树上找到一个从 a u − 1 a_{u-1} au−1 走到 a v + 1 a_{v+1} av+1 的长度等于 v − u + 2 v-u+2 v−u+2 的路径。
- 如何找这条路径呢?显然,只要找出两个节点的 LCA,按照 a u − 1 a_{u-1} au−1 到 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;
}
相关文章:
题解:CF1981C(Turtle and an Incomplete Sequence)
题解:CF1981C(Turtle and an Incomplete Sequence) Part 1:题意理解 地址链接:CF、洛谷。题面翻译:给定一个长度为 n n n 的序列 a a a,其中有一些元素未知,用 − 1 -1 −1 表示…...
Swift 中强大的 Key Paths(键路径)机制趣谈(上)
概览 小伙伴们可能不知道:在 Swift 语言中隐藏着大量看似“其貌不扬”实则却让秃头码农们“高世骇俗”,堪称卧虎藏龙的各种秘技。 其中,有一枚“不起眼”的小家伙称之为键路径(Key Paths)。如若将其善加利用ÿ…...
(十二)纹理和采样
纹理 在绘制三角形的过程中,将图片贴到三角形上进行显示的过程,就是纹理贴图的过程 uv坐标 如果如果图片尺寸和实际贴图尺寸不一致,就会导致像素不够用了的问题 纹理与采样 纹理对象(Texture):在GPU端,用来以一…...
QT创建地理信息shp文件编辑器shp_editor
空闲之余创建一个简单的矢量shp文件编辑器,加深对shp文件的理解。 一、启动程序 二、打开shp文件 三、显示shp文件的几何图形 四、双击右边表格中的feature,主窗体显示选中feature的各个节点。 五、鼠标在主窗体中选中feature的节点,按鼠标左…...
解析Kotlin中扩展函数与扩展属性【笔记摘要】
1.扩展函数 1.1 作用域:扩展函数写的位置不同,作用域就也不同 扩展函数可以写成顶层函数(Top-level Function),此时它只属于它所在的 package。这样你就能在任何类里使用它: package com.rengwuxianfun …...
【Java学习笔记】java图形界面编程
在前面的章节中,我们开发运行的应用程序都没有图形界面,但是很多应用软件,如Windows下的Office办公软件、扑克牌接龙游戏软件、企业进销存ERP系统等,都有很漂亮的图形界面。素以需要我们开发具有图形界面的软件。 Java图形界面编程…...
STM32入门笔记(03): ADC(SPL库函数版)(2)
A/D转换的常用技术有逐次逼近式、双积分式、并行式和跟踪比较式等。目前用的较多的是前3种。 A/D转换器的主要技术指标 转换时间 分辨率 例如,8位A/D转换器的数字输出量的变化范围为0~255,当输入电压的满刻度为5V时,数字量每变化…...
2024年7月2日 (周二) 叶子游戏新闻
老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 经典名作30周年新篇《恐怖惊魂夜…...
如何使用Spring Boot Profiles进行环境配置管理
如何使用Spring Boot Profiles进行环境配置管理 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何利用Spring Boot Profiles来管理不同环境…...
Java错题归纳(二)
1、若有如下接口A的定义,下列哪些类下确实现了该接口:C interface A { void method1(int i); void method2(int j); } A class B implements A{ void method1( ) { } void method2( ) { } } B class B implements A { void method1(int i ) { }…...
Grafana面试题精选和参考答案
目录 Grafana是什么以及它的主要应用场景 Grafana支持的数据源 Grafana的体系结构及主要组件 Grafana如何实现数据的可视化和监控 Grafana支持的图表类型 如何在Grafana中创建和编辑仪表盘 Grafana的查询编辑器功能 Grafana支持的认证方式 Grafana的性能调优建议 Gra…...
Node版本管理工具 fnm 安装使用
fnm 是一个基于 Rust 开发的 Node 版本管理工具,它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时,它是跨平台的,支持 macOS、Linux、Windows。🚀 Fast and simple Node.js version manager, built in R…...
vector模拟实现【C++】
文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…...
《每天5分钟用Flask搭建一个管理系统》第11章:测试与部署
第11章:测试与部署 11.1 测试的重要性 测试是确保应用质量和可靠性的关键步骤。它帮助开发者发现和修复错误,验证功能按预期工作。 11.2 Flask测试客户端的使用 Flask提供了一个测试客户端,可以在开发过程中模拟请求并测试应用的响应。 …...
Landsat数据从Collection1更改为Collection2
目录 问题解决 问题 需要注意!您使用的是废弃的陆地卫星数据集。为确保功能持续,请在2024年7月1日前更新。 在使用一些以前的代码时会遇到报错,因为代码里面用的是老的数据集 解决 对于地表反射率SR,需要在name中,将C01换为C02&…...
《每天5分钟用Flask搭建一个管理系统》第12章:安全性
第12章:安全性 12.1 Web应用的安全威胁 Web应用面临的安全威胁包括但不限于跨站脚本攻击(XSS)、SQL注入、跨站请求伪造(CSRF)、不安全的直接对象引用(IDOR)等。 12.2 Flask-Talisman扩展的使…...
Unity之创建与导出PDF
内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之创建与导出PDF TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速…...
【Android面试八股文】优化View层次过深问题,选择哪个布局比较好?
优化深层次View层次结构的问题,选择合适的布局方式是至关重要的。以下是几点建议: 使用ConstraintLayout:ConstraintLayout是Android开发中推荐的布局,能够有效减少嵌套,提高布局性能。相比RelativeLayout,…...
什么是带有 API 网关的代理?
带有 API 网关的代理服务显著提升了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的用户来说,使用 API 可以节省大量时间并提高效率。 了解 API API,即应用程序编程接口,是服务提供商和用户之间的连接网关。通过 API 连接…...
sql拉链表
1、定义:维护历史状态以及最新数据的一种表 2、使用场景 1、有一些表的数据量很大,比如一张用户表,大约1亿条记录,50个字段,这种表 2.表中的部分字段会被update更新操作,如用户联系方式,产品的…...
Debugging torch.distributed.DistBackendError: NCCL Communicator Setup and ncclUniqueId Retrieval Iss
1. 理解NCCL通信错误的核心问题 当你看到torch.distributed.DistBackendError: [2] is setting up NCCL communicator and retrieving ncclUniqueId这个错误时,本质上是在说GPU之间的"对讲机"无法正常建立连接。想象一下你正在组织一场多房间的线上会议&…...
ConvNeXt 改进 :ConvNeXt添加SAConv(可切换空洞卷积),自适应融合多尺度特征,优化小目标与遮挡目标感知,二次创新CNBlock结构
本文教的是方法,也给出几种改进方法,二次创新结构,百变不离其宗,一文带你改进自己模型,科研路上少走弯路。 作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。 理论介绍 空洞卷积(Atrous Co…...
OpenClaw跨平台同步:GLM-4.7-Flash配置在多设备间保持一致
OpenClaw跨平台同步:GLM-4.7-Flash配置在多设备间保持一致 1. 为什么需要跨设备同步OpenClaw配置 上周我在出差时遇到一个尴尬场景:笔记本上的OpenClaw突然无法响应飞书消息,而所有配置都留在办公室的台式机上。这让我意识到——当AI助手成…...
Redis 的核心机制
Redis 作为高性能内存数据库,在现代架构中早已超越了单纯的“缓存”角色,成为了支撑高并发、分布式系统的基石。深入理解其核心场景、持久化机制、内存管理及集群原理,是构建稳定、高效系统的关键。 以下结合具体业务场景,深度解析…...
【仿真】Carla跨平台部署指南:从零到一,附ROS2与Autoware.auto连接实战
1. Carla仿真平台概述 Carla是一款开源的自动驾驶仿真平台,基于虚幻引擎构建,能够提供高度逼真的城市环境和交通场景。我第一次接触Carla是在2018年,当时它还处于早期开发阶段,但已经展现出惊人的潜力。经过多年发展,现…...
Repomix Git日志集成:掌握commit历史分析的终极指南
Repomix Git日志集成:掌握commit历史分析的终极指南 【免费下载链接】repomix 📦 Repomix (formerly Repopack) is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed your codeb…...
用ProcessOn复刻《纳瓦尔宝典》思维导图:我是如何把一本投资哲学书变成可执行行动清单的
用ProcessOn将《纳瓦尔宝典》转化为可执行行动指南:从思维导图到每日实践的完整方法论 当合上这本被硅谷创投圈奉为"现代智慧集"的书籍时,很多人会陷入相似的困境——那些关于财富杠杆、幸福习惯的洞见在脑海中闪烁,却不知如何嵌入…...
华为Matebook 13双系统实战:Win10与Ubuntu 16.04无缝共存指南
1. 为什么选择华为Matebook 13安装双系统 作为一名长期使用双系统开发的工程师,我最近在华为Matebook 13上成功部署了Win10Ubuntu 16.04双系统组合。这款13英寸的轻薄本确实给了我不少惊喜——2K全面屏、1.3kg超轻机身、第八代i5处理器,这些硬件配置对于…...
深度学习标量、向量、矩阵与张量(三)
1. 定位导航 线性代数是深度学习最核心的数学工具——没有之一。神经网络的前向传播本质上就是矩阵乘法加非线性激活;反向传播本质上就是链式法则在矩阵/向量上的应用;PCA、SVD、特征分解等工具贯穿从数据预处理到模型分析的全过程。 本篇是最基础的一篇…...
比迪丽AI绘画创意开发:使用Matlab进行生成效果分析
比迪丽AI绘画创意开发:使用Matlab进行生成效果分析 1. 引言 在AI绘画创作领域,比迪丽模型因其出色的角色生成能力而备受关注。但如何科学评估生成效果、量化分析风格特征,一直是创作者面临的挑战。传统的人工评估方式主观性强、效率低下&am…...
