首页 > 其他分享 >0901-T1 北极星

0901-T1 北极星

时间:2024-09-02 09:04:44浏览次数:8  
标签:int back tp T1 北极星 序列 num 0901 push

0901-T1 北极星

题意

有一个序列 \(a\),其长度为 \(k\),初始为空(\(k=0\))。你可以进行以下三种操作。

  1. 在序列末尾添加一个 \(1\)。
  2. 把序列末尾复制一份。
  3. 拿出序列最后两个数,放入它们的和,将其余数字减一。

给定长度为 \(n\) 的序列 \(b\),构造一个长度不大于 \(10^5\) 的操作序列使 \(a\) 变为 \(b\)。

思路

考虑 \(n=1\) 时如何解决。

当 \(b \bmod 2 = 0\) 时,我们可以先构造出 \(\frac{b}{2}\),再复制一遍,合并起来。

当 \(b \bmod 2 = 1\) 时,我们可以先构造出 \(\frac{b-1}{2}\),复制一遍,合并起来,添加一个 \(1\),再合并一次。

最多在 \(O(\log n)\) 次操作内构造出一个数。

考虑 \(n \ne 1\) 时如何解决。

从左至右依次构造每一个数。这样会有一个问题,后面的合并操作会使前面减一。

如何解决这个问题?

我们可以倒着预处理出每个数需要的合并次数,当前数加上后面数需要的合并次数即可。

这样我们构造前面的数时会先让它大一点,构造后面的数时它会刚好减小到要求的数。

这样最多在 \(O(n\log n)\) 次的操作内把 \(a\) 变成 \(b\)。

实测平均 \(5 \times 10^4\) 次操作。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 5;
int calc(int num) {
	int res = 0;
	while (num != 1) {
		if (num & 1) {
			res ++, num --;
			continue;
		}
		res ++, num /= 2;
	}
	return res;
}
vector <char> tp;
void make(int num) {
	tp.clear();
	while (num != 1) {
		if (num & 1) {
			tp.push_back('+');
			tp.push_back('1');
			num --;
			continue;
		}
		tp.push_back('+');
		tp.push_back('c');
		num /= 2;
	}
	tp.push_back('1');
	reverse(tp.begin(), tp.end());
}
int n, a[N];
vector <char> ans;
int main() {
	freopen("polaris.in", "r", stdin);
	freopen("polaris.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i ++) 
		cin >> a[i];
	int r = 0;
	for (int i = n; i >= 1; i --) {
		a[i] += r, r += calc(a[i]);
	}
	for (int i = 1; i <= n; i ++) {
		make(a[i]);
		for (int j = 0; j < tp.size(); j ++) 
			ans.push_back(tp[j]);
	}
	for (int j = 0; j < ans.size(); j ++)
		cout << ans[j];
	return 0;
}

标签:int,back,tp,T1,北极星,序列,num,0901,push
From: https://www.cnblogs.com/maniubi/p/18392111

相关文章

  • zdppy+vue3+onlyoffice文档管理系统实战 20240901 上课笔记 基于验证码登录功能基本完
    遗留的问题1、点击切换验证码2、1分钟后自动切换验证码点击切换验证码实现步骤:1、点击事件2、调用验证码接口3、更新验证码的值点击事件给图片添加点击事件:<img:src="'data:image/png;base64,'+captchaImg"style="width:100%;height:50px;margin-top:10......
  • 20240901
    T1LuoguP4801饥饿的狐狸最大值考虑在两个极端之间反复横跳即可。每次跳的时候判一下先喝水是否更优。从最大和最小开始跳都要试一下。最小值随便分讨一下即可。别漏情况了。代码#include<iostream>#include<algorithm>#defineintlonglongusingnamespacestd;i......
  • Study Plan For Algorithms - Part18
    1.搜索插入位置题目链接:https://leetcode.cn/problems/search-insert-position/给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。classSolution:defsearchInsert(self,nums:List[int],target:......
  • 新赛道-2024年CSP-J/S 十一连测(四)-T1
    题目描述王老师脑袋一拍,定义了乘加运算!他定义 a∗bc=(a+b)×c 。而且他觉得用括号来规定运算的先后顺序太麻烦了,他给乘加运算定义了一个权值的系数(为乘加运算的下标),权值大的乘加运算先进行。例如下面的表达式:=====​9 ∗34​ 9 ∗12​ 1 ∗23​ 6 ∗41​ 29 ∗34......
  • 0901-T2 笼中鸟
    0901-T2笼中鸟题意给出正整数\(n,k\)。求长度为\(k\),每个数都是\([1,n]\)中的随机正整数的序列的众数的出现次数的期望值乘以\(n^k\)后的结果。35pts思路定义\(dp_{i,j,p}\)表示考虑前\(i\)种数,长度为\(j\),众数出现次数为\(p\)的序列个数。转移方程:\[dp_{i,......
  • FIT1047 Introduction to computer systems, networks and security
    FIT1047 Introductiontocomputersystems, networksand security-S2 2024Assignment2– Processesand MARIE ProgrammingPurposeProcessesandprogramsarewhatmakescomputers do what we want them to do. Inthefirst partofthisassig......
  • 【Leetcode_Hot100】哈希
    哈希1.两数之和49.字母异位词分组128.最长连续序列1.两数之和方法一:HashMap在元素放入数组之前就进行判断,保证了不会取出同一个元素的情况,,例如[3,3],如果先将数组中的所有元素放入hashMap,再判断是否存在,则返回结果为[1,1],不符合题意。classSolution{publicint[......
  • 20240901_151114 python 项目 获取需要的视频
    需求有一个视频素材目录当中有很多的视频现在需要根据音频素材的时长获取需要的视频内容编程完成项目把生成的视频存放在结果目录中分析音频的时长不同所需要的视频个数也不同视频的长度不同需要对每一个视频进行等时长的截取(例如每个视频只截取3秒钟)用户有可能一次提......
  • 20240901_161659 编程剪辑项目列表
    资料20240901_161503编程剪辑相关列表_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11889402项目20240901_151114python项目获取需要的视频_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11889375......
  • 20240901-究竟是为什么呢
    其实我不是很愿意在博客里发这些的,有被教练发现的风险,也有可能会给大家带来负面情绪。但是我真的太想要有人理解我了,真的好破防啊。我真的在控制我发负面情绪的文章了啊。。。。。。以后还是尽量不发吧。。。写完了之后觉得写成这样子没人能理解,等明天情绪稳定了来改改吧。......