二维树状数组模板(区间更新,单点查询)(以POJ 2155为例)

叁歲伎倆 2022-05-15 14:55 293阅读 0赞

题目:点击打开链接 题意:n*n坐标图起初都为0,C:翻转左下和右上两个坐标围成的矩阵中所有点,Q:查询此点的0 1状态。 分析:利用差分的思想,推广到二维,一维单点查询就是前缀和,即query(x)。区间修改先让s-n都加num,再让t+1-n减去num,即update(s, num),update(t+1, -num)。二维的单点查询变成二维就好了query(x, y)。区间修改update(x1, y1, num), update(x2+1, y1, -num), update(x1, y2+1, -num), update(x2+1, y2+1, num)。统计翻转次数是偶次还是奇次就行了。参考博客https://www.cnblogs.com/lesroad/p/8479839.html、https://www.cnblogs.com/RabbitHu/p/BIT.html。

代码:

  1. #pragma comment(linker, "/STACK:102400000,102400000")
  2. ///#include<unordered_map>
  3. ///#include<unordered_set>
  4. #include<algorithm>
  5. #include<iostream>
  6. #include<fstream>
  7. #include<complex>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<cassert>
  11. #include<iomanip>
  12. #include<string>
  13. #include<cstdio>
  14. #include<bitset>
  15. #include<vector>
  16. #include<cctype>
  17. #include<cmath>
  18. #include<ctime>
  19. #include<stack>
  20. #include<queue>
  21. #include<deque>
  22. #include<list>
  23. #include<set>
  24. #include<map>
  25. using namespace std;
  26. #define pt(a) cout<<a<<endl
  27. #define debug test
  28. #define mst(ss,b) memset((ss),(b),sizeof(ss))
  29. #define rep(i,a,n) for (int i=a;i<=n;i++)
  30. #define per(i,a,n) for (int i=n-1;i>=a;i--)
  31. #define pii pair<int,int>
  32. #define fi first
  33. #define se second
  34. #define ll long long
  35. #define ull unsigned long long
  36. #define pb push_back
  37. #define mp make_pair
  38. #define inf 0x3f3f3f3f
  39. #define eps 1e-10
  40. #define PI acos(-1.0)
  41. #define lb(x) (x&(-x))
  42. const ll mod = 1e9+7;
  43. const int N = 1e3+10;
  44. ll qp(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
  45. int to[4][2]={
  46. {-1,0},{1,0},{0,-1},{0,1}};
  47. int t,n,q,tr[N][N];
  48. void upd(int x,int y,int v) {
  49. for(int i=x;i<N;i+=lb(i))
  50. for(int j=y;j<N;j+=lb(j))
  51. tr[i][j]+=v;
  52. }
  53. int qy(int x,int y) {
  54. int res=0;
  55. for(int i=x;i>0;i-=lb(i))
  56. for(int j=y;j>0;j-=lb(j))
  57. res+=tr[i][j];
  58. return res;
  59. }
  60. int main() {
  61. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  62. while(~scanf("%d",&t)) {
  63. while(t--) {
  64. mst(tr,0);
  65. scanf("%d%d",&n,&q);
  66. while(q--) {
  67. char s[10];
  68. int x1,y1,x2,y2;
  69. scanf("%s",s);
  70. if(s[0]=='C') {
  71. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  72. upd(x1,y1,1);
  73. upd(x1,y2+1,-1);
  74. upd(x2+1,y1,-1);
  75. upd(x2+1,y2+1,1);
  76. }else {
  77. scanf("%d%d",&x1,&y1);
  78. printf("%d\n",qy(x1,y1)&1);
  79. }
  80. }
  81. printf("\n");
  82. }
  83. }
  84. return 0;
  85. }

发表评论

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

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

相关阅读