HDU 5671 Matrix

柔情只为你懂 2022-08-21 08:43 247阅读 0赞

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5671

题目大意:给你一个n行m列的矩阵
进行四种操作 交换x与y行
交换x列与y列
给x行都加上y
给x列都加上y
输出进行操作后的矩阵

解题思路:一开始想用二维树状数组做,后来发现并不用,因为每次都是一行一列加,所以用两个数组保存行列加的值就可以了
一共开四个数组 hang[]表示当前矩阵第i行是最初矩阵的hang[i]行
lie[]表示当前矩阵i列是最初矩阵的lie[i]列

初始值 hang[1]=1 hang[2]=2 hang[3]=3
比如说交换 1 2 行 再交换 2 3 行
那么hang[1]=2 hang[2]=3 hang[3]=1
也就是说相对于一开始 第一行在1,第二行在2,第三行在3。
现在在第一行的是最初的第二行,现在在第二行的是最初的第三行,现在在第三行的是最初的第一行
hangpoi[]用来记录给最初矩阵某一行加上了多少
liepoi[]用来记录给矩阵某一列加上了多少
一般给x行加上y就是这样
hangpoi[hang[x]]+=y
因为题目想要加上y的是第x行,而我们知道当前的第x行其实是最初的矩阵的第hang[x]行,我们要记录给最初矩阵加上多少。
最后输出时候我们知道i行j列
是最初矩阵的a[hang[i] ][ lie[j] ]列,最初矩阵的i行加上了hangpoi[hang[i]],最初矩阵的j列加上了liepoi[lie[j]]

  1. #include <vector>
  2. #include <list>
  3. #include <map>
  4. #include <set>
  5. #include <deque>
  6. #include <queue>
  7. #include <stack>
  8. #include <bitset>
  9. #include <algorithm>
  10. #include <functional>
  11. #include <numeric>
  12. #include <utility>
  13. #include <sstream>
  14. #include <iostream>
  15. #include <iomanip>
  16. #include <cstdio>
  17. #include <cmath>
  18. #include <cstdlib>
  19. #include <cstring>
  20. #include <ctime>
  21. #include <cassert>
  22. #define RI(N) scanf("%d",&(N))
  23. #define RII(N,M) scanf("%d %d",&(N),&(M))
  24. #define RIII(N,M,K) scanf("%d %d %d",&(N),&(M),&(K))
  25. #define mem(a) memset((a),0,sizeof(a))
  26. using namespace std;
  27. const int inf=1e9;
  28. const int inf1=-1*1e9;
  29. typedef long long LL;
  30. int a[1005][1005];
  31. int main()
  32. {
  33. int t;
  34. RI(t);
  35. while(t--)
  36. {
  37. int n,m,q;
  38. RIII(n,m,q);
  39. for(int i=1; i<=n; i++)
  40. for(int j=1; j<=m; j++)
  41. {
  42. RI(a[i][j]);
  43. }
  44. int hang[1005];
  45. int hangpoi[1005];
  46. int lie[1005];
  47. int liepoi[1005];
  48. for(int i=1; i<=n; i++)
  49. hang[i]=i;
  50. for(int j=1; j<=m; j++)
  51. lie[j]=j;
  52. mem(hangpoi);
  53. mem(liepoi);
  54. for(int i=0; i<q; i++)
  55. {
  56. int a,x,y;
  57. RIII(a,x,y);
  58. if(a==1)
  59. {
  60. swap(hang[x],hang[y]);
  61. }
  62. if(a==2)
  63. {
  64. swap(lie[x],lie[y]);
  65. }
  66. if(a==3)
  67. {
  68. hangpoi[hang[x]]+=y;
  69. }
  70. if(a==4)
  71. {
  72. liepoi[lie[x]]+=y;
  73. }
  74. }
  75. for(int i=1; i<=n; i++)
  76. {
  77. for(int j=1; j<m; j++)
  78. {
  79. printf("%d ",a[hang[i]][lie[j]]+hangpoi[hang[i]]+liepoi[lie[j]]);
  80. }
  81. printf("%d\n",a[hang[i]][lie[m]]+hangpoi[hang[i]]+liepoi[lie[m]]);
  82. }
  83. }
  84. return 0;

发表评论

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

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

相关阅读