题解:AT_past202005_i 行列操作
题解:AT_past202005_i 行列操作
思路解析:
这是一道很好的操作题,但并不难,我们可以定义两个数组 \(l\),\(r\),再定义一个布尔值 \(p\) 初始为否。
首先,我们先对 \(l\) 和 \(r\) 进行初始化,也就是 \(l_i=i\),\(r_i=i\),即:
for(i=1;i<=n;i++) {
l[i]=i;
r[i]=i;
}
交换行就是将 \(l_i\) 和 \(l_j\) 交换,即:
if(op==1) {
cin>>i>>j;
swap(l[i],l[j]);
}
交换列就是将 \(r_i\) 和 \(r_j\) 交换,即:
if(op==2) {
cin>>i>>j;
swap(r[i],r[j]);
}
转置就是将 \(l\) 和 \(r\) 交换,再对 \(p\) 异或 \(1\),即:
if(op==3) {
p^=1;
swap(l,r);
}
输出就是将 \(i\) 赋值成 \(l_i\),将 \(j\) 赋值成 \(r_j\),再判断 \(p\) 是不是等于 \(1\),如果是,就交换 \(i\),\(j\),再输出 \((n*(i-1)+j)-1\),即:
if(op==4) {
cin>>i>>j;
i=l[i];
j=r[j];
if(p==1) {
swap(i,j);
}
cout<<(n*(i-1)+j)-1<<"\n";
}
最终代码:
#include<bits/stdc++.h>
#define N 100010
#define int long long
using namespace std;
int n,q,op,i,j,l[N],r[N];
bool p=false;
signed main() {
cin>>n>>q;
for(i=1;i<=n;i++) {
l[i]=i;
r[i]=i;
}
while(q--) {
cin>>op;
//交换行。
if(op==1) {
cin>>i>>j;
swap(l[i],l[j]);
}
//交换列。
if(op==2) {
cin>>i>>j;
swap(r[i],r[j]);
}
//进行转置。
if(op==3) {
p^=1;
swap(l,r);
}
//输出。
if(op==4) {
cin>>i>>j;
i=l[i];
j=r[j];
if(p==1) {
swap(i,j);
}
//不要忘记换行哦。
cout<<(n*(i-1)+j)-1<<"\n";
}
}
//AC!
return 0;
}

浙公网安备 33010602011771号