POJ 1195 Mobile phones【树状数组二维】

迈不过友情╰ 2022-10-06 05:53 266阅读 0赞

题目大意

  1. 更新:一个矩阵的一个元素
  2. 求和:求一个子矩阵元素和
  3. 学习了二维的树状数组
  4. 和一维一样
  5. 只需要记住,对于矩阵A
  6. C[i][j]的表示的是
  7. 矩阵A[i][j]向左上分别延伸lowbit(i)和lowbit(j)个单位形成的子矩阵的和
  8. #include <stdio.h>
  9. #include <iostream>
  10. using namespace std;
  11. #pragma warning(disable:4996)
  12. #define debug(x) cout<<#x<<": "<<(x)<<endl;
  13. #define low(x) ((x)&(-x))
  14. typedef long long ll;
  15. //ll a[1025][1025];
  16. ll c[1025][1025];
  17. ll s;
  18. bool update(ll x, ll y, ll A) {
  19. for (ll i=x; i <= s; i += low(i)) {
  20. for (ll j=y; j <= s; j += low(j)) {
  21. c[i][j] += A;
  22. }
  23. }
  24. return true;
  25. }
  26. ll getS(ll x, ll y) {
  27. ll ret = 0;
  28. for (ll i = x; i > 0 ; i -= low(i)) {
  29. for (ll j = y; j > 0; j -= low(j)) {
  30. ret += c[i][j];
  31. }
  32. }
  33. return ret;
  34. }
  35. int main() {
  36. //freopen("../in1.txt","r",stdin);
  37. ll t;
  38. memset(c, 0, sizeof(c));
  39. while (cin >> t) {
  40. if (t == 0) {
  41. cin >> s;
  42. }
  43. else if (t == 1) {
  44. ll x, y, A;
  45. cin >> x >> y >> A;
  46. update(x + 1, y + 1, A);
  47. }
  48. else if (t == 2) {
  49. ll x1, y1, x2, y2;
  50. cin >> x1 >> y1 >> x2 >> y2;
  51. //debug(getS(x2 + 1, y2 + 1))
  52. ll s = getS(x2+1,y2+1) - getS(x2+1,y1) - getS(x1,y2+1) + getS(x1,y1) ;
  53. cout << s << endl;
  54. }
  55. }
  56. return 0;
  57. }

在这里插入图片描述


更新a[1][1]示例:
图片链接,侵删
https://www.docin.com/p-403698374.html

在这里插入图片描述

发表评论

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

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

相关阅读