洛谷 P8318 题解
题意:
给出一个长度为 的操作后的序列,然后给出 次操作过程,每次给出操作类型 、操作数 和 ,求出操作前的原始序列。
在操作中,如果 ,那么新的 就分别等于原始 的
两倍或平方。即:如果 ,那么新的第 个元素就等于它的两倍;如果 ,那么新的第 个元素就等于它的平方。
思路:
模拟题,但是坑点很多。
-
由于给出的是操作后的序列,所以我们在还原时需要倒序还原,例如:,两次操作分别是 和 。那么我们就需要先还原 再还原 。
-
同上,需要倒序还原,如果操作中是乘法,还原时就需要用除法,加减法同理。
-
题目中还提到 的情况。当 时,原操作是将第 个元素 ,那么我们在还原时就需要将它 ;同理,当 时,原操作是将第 个元素变成它的平方,那么我们在还原时就要将它进行
sqrt()
。
code:
#include <bits/stdc++.h>
using namespace std;
inline long long read(){
long long s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s*f;
}
int n,m;
long long a[1005];
int op[1005],x[1005],y[1005];
int main(){
n=read();m=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
for(int i=1;i<=m;i++){
op[i]=read();x[i]=read();y[i]=read();
}
for(int i=m;i>=1;i--){
if(op[i]==1){
if(x[i]==y[i]){
a[x[i]]/=2;
}
else{
a[x[i]]-=a[y[i]];
}
}
else{
if(x[i]==y[i]){
a[x[i]]=sqrt(a[x[i]]);
}
else{
a[x[i]]/=a[y[i]];
}
}
}
for(int i=1;i<=n;i++){
printf("%lld ",a[i]);
}
return 0;
}
本文来自博客园,作者:Black--Panda,转载请注明原文链接:https://www.cnblogs.com/liu-black/p/p8318-tijie.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现