题解: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;
}
posted @ 2026-01-11 21:27  Mirror_victor  阅读(0)  评论(0)    收藏  举报