1 条题解
-
0
自动搬运
来自洛谷,原作者为

寄风
现实中的你,是否很成功?搬运于
2025-08-24 22:45:52,当前版本为作者最后更新于2023-03-18 22:27:45,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意
有一个数 ,初始为 。
现在有 个操作,每个操作有两种类型:
- 把 变为 。
- 把 加上 。
注意,多组数据测试。
解法
考虑开一个数 去模拟,但我们惊喜的发现
long long炸了。于是考虑高精度。
如果你手写一个高精度去模拟的话,会发现能拿 分。
然后自然的想到去优化这个高精度。
优化第一步:
十进制转二进制太麻烦还耗时?那直接用二进制高精!
优化第二步:
乘 太耗时?别忘了我们现在是二进制。乘 直接在后面加个 就行了。
优化第三步:
把 一个一个加上去进位太慢?那直接把 一股脑加到最后一位上,最后处理完后在统一进位。
然后就可以过了。没错,就是这么简单。
(但我为什么赛时没想到呢?呜呜呜)实现细节:
最后一位在哪里可以用一个指针 表示, 一开始记得放在中间,前面的位置预留出来方便进位。
代码:
#include <bits/stdc++.h> using namespace std; #define int long long inline int read(){ int s = 0 , xi = 1; char op = getchar(); while(op < '0' || op > '9'){ if(op == '-') xi = -1; op = getchar(); } while(op >= '0' && op <= '9'){ s = (s << 1) + (s << 3) + op - '0'; op = getchar(); } return s * xi; } inline void print(int x){ if(x < 0) putchar('-') , x *= -1; if(x < 10){ putchar(x + '0'); return; } print(x / 10); putchar(x % 10 + '0'); } int n , t; struct Int{ int a[100005] = {} , pos = 50000 , l = pos; void test1(){ pos++; } void test2(int d){ a[pos] += d; } void end(){ for(int i = pos;i;i--){ a[i - 1] += a[i] / 2; a[i] %= 2; } for(int i = 1;i <= l;i++){ if(a[i]){ l = i; break; } } if(a[l] == 0) l = pos; } void write(){ for(int i = l;i <= pos;i++){ print(a[i]); } putchar('\n'); } }; signed main(){ // freopen(".in" , "r" , stdin); // freopen(".out" , "w" , stdout); t = read(); while(t--){ Int a; n = read(); for(int i = 1;i <= n;i++){ int op = read(); if(op == 1){ a.test1(); } else{ a.test2(read()); } } a.end(); a.write(); } return 0; }
- 1
信息
- ID
- 5842
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者