2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest B. Make It Equal

news/2024/11/20 23:32:09/文章来源:https://www.cnblogs.com/YipChipqwq/p/18559613

因为和题解有所区别,所以写一发题解增长见识。

题面

B. Make It Equal

给你一个大小为 \(n\) 的整数数组 \(a\) 。数组元素的编号从 \(1\)\(n\)

您可以执行以下任意次数的操作(可能为 0 次):从 \(1\)\(n\) 中选择一个索引 \(i\) ;将 \(a_i\) 减少 \(2\) ,并将 \(a_{(i \bmod n) + 1}\) 增加 \(1\)

执行这些操作后,数组中的所有元素都应是非负等整数

你的任务是计算最少需要执行的操作次数。

题解

考虑将 \(a_i\) 写作二进制形式,从\(0\) 位开始计数(方便描述)。

如果第 \(j(j > 0)\) 位为 \(1\)\(a_i\) 可以自减 \(2^j\),操作次数为 \(2^{j-1}\),同时对 \(1 \le t < j\) 的每个 \(a_{i + t}\)\(2^{j - t - 1}\) 次操作,可以发现,只有 \(a_{i+j}\) 的值增加了 \(1\)

循环操作之后,可以发现所有的 \(a_i\) 是小于等于 \(1\) 的,如果所有的 \(a_i\) 不都等于 \(1\),那么答案不存在,考虑退回一次操作需要让 \(a_i \ge 2\),让所有的 \(a_i \ge 1\) 后容易发现对所有位置做一次操作后回到了 \(a_i \le 1\),且恰好为原来位置的取反值,因此只有全 \(0\) 和全 \(1\) 有解。

对于最小的解只需要所有操作数减去最小操作数即可。

第一次循环操作复杂度是 \(O(n\log^2{a_i})\),第二次循环操作是 \(O(n)\) 的。

对赋值的操作精细化可以去掉第一次循环的 \(O(\log{a_i})\),用 \(\operatorname{lowbit}\) 优化直接去计算需要减去的值可以去掉对位的枚举做到 \(O(n)\)

时间复杂度 \(O(n\log^2{a_i})\) 的代码如下,\(O(n)\) 应该不难实现。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;void solve()
{int n;cin >> n;vector<ll> a(n), cnt(n);for (int i = 0; i < n; i ++ ) cin >> a[i];int pd = 0;while (!pd){pd = 1;for (int i = 0; i < n; i ++ ){if (a[i] <= 1) continue;pd = 0;int t = 1;while (1ll << (t + 1) <= a[i]) t ++ ;for (int j = t; j; j -- ){if (a[i] >> j & 1){a[i] ^= 1ll << j;a[(i + j) % n] ++ ;for (int k = 0; k < j; k ++ ) cnt[(i + k) % n] += 1ll << (j - k - 1);}}}}int num = count(a.begin(), a.end(), 1);if (num != n) cout << "-1\n";else{ll minn = *min_element(cnt.begin(), cnt.end());ll res = accumulate(cnt.begin(), cnt.end(), 0) - n * minn;cout << res << "\n";}
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T -- ) solve();return 0;
}

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

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

相关文章

敏捷开发:Scrum 中的 Product Backlog 介绍

Product Backlog 产品待办列表 在计划开发产品功能时,都希望产品功能上线后,用户能够喜欢并经常使用。 因此在开发产品新功能时,就要衡量哪些产品需求是对用户最有价值,这是最应该思考的问题。 然后把这些有价值的需求集合放在一起。当然,也有与需求实现相关的其它工作项。…

自我理解的洋葱模型

前言 简单说自己理解的洋葱模型。 正文 先来看一个洋葱模型:这个是ddd的洋葱模型。 我们看到最里面的是domain model。 为什么里面是domain model呢? 领域模型 domain model 是做什么的,是实现我们业务逻辑模型的,这个重中之重。 然后看domain services 是什么呢? 当涉及到…

B.XOR = 平均值

题目 给你一个整数 n 。找出一个由 n 个整数 a1, a2, ..., an 组成的序列,使得所有 i 和 i<= ai<=10^9 都是i<=ai<=10^9 。其中⊕表示 bitwise XOR。 可以证明存在满足上述所有条件的整数序列。 输入 第一行输入包含 t ( i <= t <= 10^4 ) - 测试用例数。 每…

攻防世界-easyupload

打开环境有一个文件上传的界面 结合题目名字,这是一道木马上传的题目 直接上传木马图片 给出回显“Your file looks wicked”,这说明了此处的文件上传存在过滤首先尝试修改一句话木马的构造<?php @eval($_POST[1]);?><?=eval($_POST[1]);?>利用直接利用短标签…

yolo --- 官方提供的预训练模型

下载路径:https://github.com/ultralytics/ultralytics官方提供了不同规格的模型,其含义分别如下:规格含义示例YOLOv8 Nano 非常小 YOLOv8nYOLOv8 Small 小 YOLOv8sYOLOv8 Medium 中 YOLOv8mYOLOv8 Large 大 YOLOv8lYOLOv8 X(Extra Large) 非常大 YOLOv8x

关于远程连接虚拟机Network error: Connection timed out的问题

今日在使用MobaXterm远程连接虚拟机的时候报错Network error: Connection timed out。令我感到诧异,昨天都能连上,今天突然不行了。经过查看发现我所使用的NAT模式的ip并没有发生改变可以看到我这里虚拟机使用的是VMnet8解决方式为:1.在控制面版中搜索“网络”,点击查看网络…

基于木舟平台浅谈surging 的热点KEY的解决方法

一、概述上篇文章介绍了基于surging的木舟平台如何构建起微服务 ,那么此篇文章将介绍基于木舟平台浅谈surging 的热点KEY的解决方法木舟 (Kayak) 是什么?木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台。支持异步和响应式编…

单变量微积分学习笔记:线性和二阶近似(16)【3】

线性近似 公式 \(x \to x_0\),\(f(x) \approx f(x_0) + f(x_0)(x-x_0)\)【切线】推导: \(f(x_0) = \lim_{x \to x_0}\frac{f(x)-f(x_0)}{x-x_0}\)【导数的定义】推论 前提:\(x \approx 0\), \[\sin(x) \approx x \]\[\cos(x) \approx 1 \]\[e^x \approx 1 + x \]\[ln(x+1) …

Spring之OCP开闭原则和DIP依赖倒置原则

通过如下代码,来分析几个开发原则(OCP开闭原则和DIP依赖倒置原则) 代码结构1.Test类 package com.xu.spring6.client;import com.xu.spring6.web.UserAction;public class Test {public static void main(String[] args) {UserAction userAction = new UserAction();userAct…

Blog2-题目集4~6

一、前言: 本次的大作业,包含了两个部分,一个是之前的1-3大作业(答题程序)还剩余的一次迭代,另外两个是最近做的电路设计的迭代,总而来说,这些大作业都是对于自己能力的考验,也是对自己的提升。二、设计与分析: 大作业4最后一题: 1.源码分析: 这次的迭代相比于上次…

面试题精选04-使用Linq怎么将数据分组之后按时间排序取最新1条数据

实体类 public class Movie {public string Name { get; set; }public string Area { get; set; }public DateTime ProductTime { get; set; } }初始化数据 public static List<Movie> InitData() {List<Movie> data = new List<Movie>(){new Movie(){ Name=…

WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

什么是文件包含 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时, 直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。 在包含文件的过程中,如果文件能进行控制(如进行替换和修改),则存储文件包含漏洞白盒发现: 在php…