【题解】洛谷 P10765 「CROI · R2」在相思树下 I
I 原题
II 题意简述
共
对于每一组测试数据,有初始数列,共
数据满足
III 解析
思考最后两步可能的情况。容易发现,满足这种情况的话,第
综合一下,最后一步的操作如果是操作
那么问题来了,如何知道这个关键的“第
观察这个数列的变化规律,我们能够发现,如果执行操作
注意:
- 必须给
赋初始值 。 - 需要用
long long
来存储 。
IV 代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll t; // 测试数据组数
inline void read(ll& x){ // 快读
ll s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9') { w = (ch == '-' ? -1 : w); ch = getchar(); }
while(ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); }
x = s * w;
}
inline void write(ll x){ // 快写
if(x < 0) { x = -x; putchar('-'); }
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
inline void write(ll x, char ch) { write(x); putchar(ch); }
int main(){
read(t);
while(t--){
ll n, k, a = 1, b = 2, d = 1; // n, k 表示初始数列长度,操作次数,a, b, d 分别维护数列的第一项、第二项、公差
read(n), read(k);
for(int i = 1; i <= k; i++){
ll x; read(x);
if(i == k)
write((x == 1 ? b : a), '\n'); // 依据最后一步的操作种类来判断答案是数列第一项还是第二项
if(x == 1){ // 若操作 1
ll tmp = b;
a = tmp; b = tmp + 2 * d; // 新数列第一项 a 变为原数列第二项 b, 新数列第二项变为原数列第四项
// 数列第四项等于数列第二项加二倍公差
d *= 2; // 更新数列公差
// 如果先更新公差,b 加一倍的 d 即可
}else if(x == 2){ // 若操作 2
b += d; // 新数列第一项不变,新数列第二项等于原数列第三项
// 原数列第三项等于原数列第二项加一倍公差
d *= 2; // 更新公差
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」