hdu_5671 矩阵行列移动等

博客内容介绍了如何处理矩阵的行交换、列交换及行/列加常数操作,关键在于记录原始矩阵的对应关系和增量,并在输出时应用这些信息。复杂度为O(q+mn),其中q是操作数量,mn是矩阵大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个nnmm列的矩阵(1 \leq n \leq 1000 ,1 \leq m \leq 1000 )(1n1000,1m1000),在这个矩阵上进行qq  (1 \leq q \leq 100,000)(1q100,000) 个操作:

1 x y: 交换矩阵MM的第xx行和第yy(1 \leq x,y \leq n)(1x,yn);
2 x y: 交换矩阵MM的第xx列和第yy(1 \leq x,y \leq m)(1x,ym);
3 x y: 对矩阵MM的第xx行的每一个数加上y(1 \leq x \leq n,1 \leq y \leq 10,000)y(1xn,1y10,000);
4 x y: 对矩阵MM的第xx列的每一个数加上y(1 \leq x \leq m,1 \leq y \leq 10,000)y(1xm,1y10,000);

官方题解:

对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。

对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。

输出时通过索引找到原矩阵中的值,再加上行、列的增量。

复杂度O(q+mn)O(q+mn)


#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>

using namespace std ;

const int maxn = 1005 ; 

int t ; 
int a[maxn],b[maxn] ;
long long c[maxn],d[maxn] ;
long long arr[maxn][maxn] ; 
int n , m ,q  ; 

int main()
{

	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&n,&m,&q) ; 
		int maxx = max(n,m) ; 
		for(int i = 1 ; i <= maxx ; i++)
		{
			a[i] = i ; b[i] = i ;
			c[i] = 0 ; d[i] = 0 ; 
		}

		for(int i = 1 ; i <= n ; i++)
		{
			for(int j = 1 ; j <= m ; j++)
			{
				scanf("%I64d",&arr[i][j]) ; 
			}
		}

		while(q--)
		{
			int i , j , k ; 
			scanf("%d%d%d",&i,&j,&k);
			if(i==1)
			{
				swap(a[j],a[k]) ;
			}
			else if(i==2)
			{
				swap(b[j],b[k]) ;
			}
			else if(i==3)
			{
				c[a[j]] += k ; 
			}
			else 
			{
				d[b[j]] += k ; 
			}
		}
		for(int i = 1 ; i <= n ; i++)
		{
			for(int j = 1 ; j <= m ; j++)
			{
				printf("%I64d",arr[a[i]][b[j]]+c[a[i]]+d[b[j]]) ;
				if(j!=m)printf(" ");
			}
			printf("\n");
		}
	}
	return  0 ; 
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值