hdu_5671 矩阵行列移动等

来源:互联网 发布:蚁群算法matlab 编辑:程序博客网 时间:2024/06/05 12:00

有一个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 ; }





0 0
原创粉丝点击