当前位置: 首页 > news >正文

题解: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;
}

相关文章:

题解:CF1981C(Turtle and an Incomplete Sequence)

题解&#xff1a;CF1981C&#xff08;Turtle and an Incomplete Sequence&#xff09; Part 1&#xff1a;题意理解 地址链接&#xff1a;CF、洛谷。题面翻译&#xff1a;给定一个长度为 n n n 的序列 a a a&#xff0c;其中有一些元素未知&#xff0c;用 − 1 -1 −1 表示…...

Swift 中强大的 Key Paths(键路径)机制趣谈(上)

概览 小伙伴们可能不知道&#xff1a;在 Swift 语言中隐藏着大量看似“其貌不扬”实则却让秃头码农们“高世骇俗”&#xff0c;堪称卧虎藏龙的各种秘技。 其中&#xff0c;有一枚“不起眼”的小家伙称之为键路径&#xff08;Key Paths&#xff09;。如若将其善加利用&#xff…...

(十二)纹理和采样

纹理 在绘制三角形的过程中&#xff0c;将图片贴到三角形上进行显示的过程&#xff0c;就是纹理贴图的过程 uv坐标 如果如果图片尺寸和实际贴图尺寸不一致&#xff0c;就会导致像素不够用了的问题 纹理与采样 纹理对象(Texture)&#xff1a;在GPU端&#xff0c;用来以一…...

QT创建地理信息shp文件编辑器shp_editor

空闲之余创建一个简单的矢量shp文件编辑器&#xff0c;加深对shp文件的理解。 一、启动程序 二、打开shp文件 三、显示shp文件的几何图形 四、双击右边表格中的feature&#xff0c;主窗体显示选中feature的各个节点。 五、鼠标在主窗体中选中feature的节点&#xff0c;按鼠标左…...

解析Kotlin中扩展函数与扩展属性【笔记摘要】

1.扩展函数 1.1 作用域&#xff1a;扩展函数写的位置不同&#xff0c;作用域就也不同 扩展函数可以写成顶层函数&#xff08;Top-level Function&#xff09;&#xff0c;此时它只属于它所在的 package。这样你就能在任何类里使用它&#xff1a; package com.rengwuxianfun …...

【Java学习笔记】java图形界面编程

在前面的章节中&#xff0c;我们开发运行的应用程序都没有图形界面&#xff0c;但是很多应用软件&#xff0c;如Windows下的Office办公软件、扑克牌接龙游戏软件、企业进销存ERP系统等&#xff0c;都有很漂亮的图形界面。素以需要我们开发具有图形界面的软件。 Java图形界面编程…...

STM32入门笔记(03): ADC(SPL库函数版)(2)

A/D转换的常用技术有逐次逼近式、双积分式、并行式和跟踪比较式等。目前用的较多的是前3种。 A/D转换器的主要技术指标 转换时间 分辨率 例如&#xff0c;8位A/D转换器的数字输出量的变化范围为0&#xff5e;255&#xff0c;当输入电压的满刻度为5V时&#xff0c;数字量每变化…...

2024年7月2日 (周二) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 经典名作30周年新篇《恐怖惊魂夜…...

如何使用Spring Boot Profiles进行环境配置管理

如何使用Spring Boot Profiles进行环境配置管理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot Profiles来管理不同环境…...

Java错题归纳(二)

1、若有如下接口A的定义&#xff0c;下列哪些类下确实现了该接口&#xff1a;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 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, built in R…...

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…...

《每天5分钟用Flask搭建一个管理系统》第11章:测试与部署

第11章&#xff1a;测试与部署 11.1 测试的重要性 测试是确保应用质量和可靠性的关键步骤。它帮助开发者发现和修复错误&#xff0c;验证功能按预期工作。 11.2 Flask测试客户端的使用 Flask提供了一个测试客户端&#xff0c;可以在开发过程中模拟请求并测试应用的响应。 …...

Landsat数据从Collection1更改为Collection2

目录 问题解决 问题 需要注意!您使用的是废弃的陆地卫星数据集。为确保功能持续&#xff0c;请在2024年7月1日前更新。 在使用一些以前的代码时会遇到报错&#xff0c;因为代码里面用的是老的数据集 解决 对于地表反射率SR&#xff0c;需要在name中&#xff0c;将C01换为C02&…...

《每天5分钟用Flask搭建一个管理系统》第12章:安全性

第12章&#xff1a;安全性 12.1 Web应用的安全威胁 Web应用面临的安全威胁包括但不限于跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入、跨站请求伪造&#xff08;CSRF&#xff09;、不安全的直接对象引用&#xff08;IDOR&#xff09;等。 12.2 Flask-Talisman扩展的使…...

Unity之创建与导出PDF

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之创建与导出PDF TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快速…...

【Android面试八股文】优化View层次过深问题,选择哪个布局比较好?

优化深层次View层次结构的问题&#xff0c;选择合适的布局方式是至关重要的。以下是几点建议&#xff1a; 使用ConstraintLayout&#xff1a;ConstraintLayout是Android开发中推荐的布局&#xff0c;能够有效减少嵌套&#xff0c;提高布局性能。相比RelativeLayout&#xff0c;…...

什么是带有 API 网关的代理?

带有 API 网关的代理服务显著提升了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的用户来说&#xff0c;使用 API 可以节省大量时间并提高效率。 了解 API API&#xff0c;即应用程序编程接口&#xff0c;是服务提供商和用户之间的连接网关。通过 API 连接…...

sql拉链表

1、定义&#xff1a;维护历史状态以及最新数据的一种表 2、使用场景 1、有一些表的数据量很大&#xff0c;比如一张用户表&#xff0c;大约1亿条记录&#xff0c;50个字段&#xff0c;这种表 2.表中的部分字段会被update更新操作&#xff0c;如用户联系方式&#xff0c;产品的…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...