poj 2155 Matrix (二维树状数组)

举报
xindoo 发表于 2022/04/16 02:15:12 2022/04/16
【摘要】         这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是0,然后给你两个操作,一个是给你左上角和右下角的坐标,把这个长方形的区间所有元素反取反(0变1 1变0),另一个是求某个具体坐标的值。       &nbsp...

        这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是0,然后给你两个操作,一个是给你左上角和右下角的坐标,把这个长方形的区间所有元素反取反(0变1 1变0),另一个是求某个具体坐标的值。

       这里我用了二维的线树状数组,一维树状数组可以解决区间更新和点查询的问题,这里只需要加一维就可以了,代码比较好写,不过开始犯了很多低级的错误。


  
  1. //============================================================================
  2. // Name : 2012083101.cpp
  3. // Author : xindoo
  4. // Version :
  5. // Copyright : Your copyright notice
  6. // Description : poj 2155
  7. // Data : 2013-08-29-17.06
  8. //============================================================================
  9. #include <stdio.h>
  10. #include <string.h>
  11. const int maxn = 1004;
  12. int xy[maxn][maxn];
  13. int n;
  14. inline int lowbit(int x)
  15. {
  16. return x&-x;
  17. }
  18. void update(int x, int y, int v)
  19. {
  20. int t = y;
  21. while (x <= n)
  22. {
  23. y = t;
  24. while (y <= n)
  25. {
  26. xy[x][y] += v;
  27. y += lowbit(y);
  28. }
  29. x += lowbit(x);
  30. }
  31. }
  32. int getsum(int x, int y)
  33. {
  34. int sum = 0;
  35. int t = y;
  36. while (x)
  37. {
  38. y = t;
  39. while (y)
  40. {
  41. sum += xy[x][y];
  42. y -= lowbit(y);
  43. }
  44. x -= lowbit(x);
  45. }
  46. return sum;
  47. }
  48. int main()
  49. {
  50. int q, kase;
  51. char op;
  52. int x1, x2, y1, y2;
  53. scanf("%d", &kase);
  54. while (kase--)
  55. {
  56. scanf("%d %d", &n, &q);
  57. memset(xy, 0, sizeof(xy));
  58. while (q--)
  59. {
  60. getchar();
  61. scanf("%c", &op);
  62. if (op == 'Q')
  63. {
  64. scanf("%d %d", &x1, &y1);
  65. int t = getsum(x1, y1);
  66. if (t&1)
  67. printf("%d\n", 1);
  68. else
  69. printf("%d\n", 0);
  70. }
  71. else
  72. {
  73. scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
  74. update(x1, y1, 1);
  75. update(x1, y2+1, -1);
  76. update(x2+1, y1, -1);
  77. update(x2+1, y2+1, 1);
  78. }
  79. }
  80. if (kase)
  81. puts("");
  82. }
  83. return 0;
  84. }



文章来源: xindoo.blog.csdn.net,作者:xindoo,版权归原作者所有,如需转载,请联系作者。

原文链接:xindoo.blog.csdn.net/article/details/10737545

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。