hdu_5671 矩阵行列移动等

超、凢脫俗 2022-08-21 10:39 224阅读 0赞
  1. 有一个nnmm列的矩阵(1 \leq n \leq 1000 ,1 \leq m \leq 1000 )(1n1000,1m1000),在这个矩阵上进行qq (1 \leq q \leq 100,000)(1q100,000) 个操作:
  2. 1 x y: 交换矩阵MM的第xx行和第yy行(1 \leq x,y \leq n)(1x,yn);
  3. 2 x y: 交换矩阵MM的第xx列和第yy列(1 \leq x,y \leq m)(1x,ym);
  4. 3 x y: 对矩阵MM的第xx行的每一个数加上y(1 \leq x \leq n,1 \leq y \leq 10,000)y(1xn,1y10,000);
  5. 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+m**n)

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <string>
  5. #include <cmath>
  6. #include <algorithm>
  7. using namespace std ;
  8. const int maxn = 1005 ;
  9. int t ;
  10. int a[maxn],b[maxn] ;
  11. long long c[maxn],d[maxn] ;
  12. long long arr[maxn][maxn] ;
  13. int n , m ,q ;
  14. int main()
  15. {
  16. scanf("%d",&t);
  17. while(t--)
  18. {
  19. scanf("%d%d%d",&n,&m,&q) ;
  20. int maxx = max(n,m) ;
  21. for(int i = 1 ; i <= maxx ; i++)
  22. {
  23. a[i] = i ; b[i] = i ;
  24. c[i] = 0 ; d[i] = 0 ;
  25. }
  26. for(int i = 1 ; i <= n ; i++)
  27. {
  28. for(int j = 1 ; j <= m ; j++)
  29. {
  30. scanf("%I64d",&arr[i][j]) ;
  31. }
  32. }
  33. while(q--)
  34. {
  35. int i , j , k ;
  36. scanf("%d%d%d",&i,&j,&k);
  37. if(i==1)
  38. {
  39. swap(a[j],a[k]) ;
  40. }
  41. else if(i==2)
  42. {
  43. swap(b[j],b[k]) ;
  44. }
  45. else if(i==3)
  46. {
  47. c[a[j]] += k ;
  48. }
  49. else
  50. {
  51. d[b[j]] += k ;
  52. }
  53. }
  54. for(int i = 1 ; i <= n ; i++)
  55. {
  56. for(int j = 1 ; j <= m ; j++)
  57. {
  58. printf("%I64d",arr[a[i]][b[j]]+c[a[i]]+d[b[j]]) ;
  59. if(j!=m)printf(" ");
  60. }
  61. printf("\n");
  62. }
  63. }
  64. return 0 ;
  65. }

发表评论

表情:
评论列表 (有 0 条评论,224人围观)

还没有评论,来说两句吧...

相关阅读