P8318『JROI-4』淘气的猴子 题解
Dream_weavers · · 题解
题意
有一个长度为
-
1 x y表示第x 个元素加上第y 个元素。 -
2 x y表示第x 个元素乘上第y 个元素。
如果
现在给出序列
思路
体面看起来挺吓唬人,甚至线段树的题刷多了还以为是线段树,但就是一道简单的模拟。
建一些数组或一个结构体记录这些操作,然后逆序进行操作。这里逆序指操作顺序相反,加变成减(
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,b[N];
struct node{//建一个记录操作的结构体
int opt,x,y;
}f[N];
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
for(int i=1;i<=m;i++){//输入操作
scanf("%lld%lld%lld",&f[i].opt,&f[i].x,&f[i].y);
}
for(int i=m;i>0;i--){//进行“逆序”操作
int opt=f[i].opt,x=f[i].x,y=f[i].y;
if(opt==1){
if(x!=y)b[x]-=b[y];
else b[x]/=2;//特判x=y
}else if(opt==2){
if(x!=y)b[x]/=b[y];
else b[x]=sqrt(b[x]);//特判x=y
}
}
for(int i=1;i<=n;i++)printf("%lld ",b[i]);//还原
return 0;
}