众所周知,jockbutt 是一个可爱的女孩纸。
题目描述
jockbutt 有一个正整数序列,长度为 n,分别为 a1,a2...an,她非常喜欢这个序列,平时都非常爱惜它们。
可是有一天,当 jockbutt 在和你约会的时候,有一只淘气的小猴子改变了这个序列。
猴子操作了 m 次。
猴子的操作有两种类型:
- 1 x y 表示第 x 个元素加上第 y 个元素。
- 2 x y 表示第 x 个元素乘上第 y 个元素。
特别且显然地,当 x=y,新的 x 就等于原来的 x 的两倍或平方。
序列最后结果形如 b1,b2...bn。
等到 jockbutt 回来时,全洛谷的人都在看猴子。(其实 jockbutt 才是他们看的猴子吧)
jockbutt 非常生气,希望你能告诉她这个序列最初的形态,也就是 a1,a2,a3,...,an 否则她就会嘤嘤嘤...
输入格式
一共有 m+2行。
第一行输入两个数 n,m。
第二行输入 n 个数 b1,b2...bn,表示经过操作后的序列。
第 3∼m+2 行每一行输入 3 个数 k,x,y,分别表示操作类型,以及操作中的 x 和 y。
输出格式
一行,n 个整数 a1,a2...an,表示序列最初的样子。
输入输出样例
输入
5 5 12 1 12 4 2 1 3 2 1 4 3 2 3 4 1 5 2 2 1 3
输出
1 1 2 1 1
说明/提示
本题采用捆绑测试。
...(还有一些条件自己去洛谷看)
首先要知道的是,这是一道入门题,穷举加暴力即可.
但也有一点需要注意的地方.
特别且显然地,当 x=y,新的 x 就等于原来的 x 的两倍或平方。
OK啊,就说到这里,上AC代码
其实还有很多可以优化的地方但是我这个蒟蒻不配
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
long long x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void write(long long x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
long long a[1001],k[201],x[201],y[201];
int main(){
long long n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++){
k[i]=read(),x[i]=read(),y[i]=read();
}
for(int i=m;i>=1;i--){
if(k[i]==1){
if(x[i]==y[i]) a[x[i]]/=2;
else a[x[i]]-=a[y[i]];
}
if(k[i]==2){
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++){
write(a[i]);
putchar(' ');
}
return 0;
}
/*
3 2
10 9 4
1 1 1
2 2 2
5 3 4
*/
There`s nothing to say.