P8318 题解
思路
很明显我们恢复序列时要把加法变成减法,把乘法变成除法,但因为猴子是从前往后操作的,所以我们要从后往前恢复。
特别且显然地,当 ,新的 就等于原来的 两倍或平方。
如果 ,且操作为 号操作,我们就需要把 的值除以 ,若为 号操作,我们就需要把 变为 。
提醒
恢复序列时要从最后一个操作开始恢复!
代码
#include<iostream>
#include<cmath>
using namespace std;
int n,m,k[205],x[205],y[205];
long long b[1005];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=m;i++){
cin>>k[i]>>x[i]>>y[i];
}
for(int i=m;i>=1;i--){
if(k[i]==1){
if(x[i]==y[i]){
b[x[i]]/=2;
}else{
b[x[i]]-=b[y[i]];
}
}
if(k[i]==2){
if(x[i]==y[i]){
b[x[i]]=sqrt(b[x[i]]);
}else{
b[x[i]]/=b[y[i]];
}
}
}
for(int i=1;i<=n;i++){
cout<<b[i]<<' ';
}
return 0;
}