POJ 2029 二维树状数组

浅浅的花香味﹌ 2022-11-20 11:54 355阅读 0赞

二维树状数组模板题

AC代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int max_N=500+1;
  6. int bit[max_N][max_N];
  7. int n,m;
  8. int lowbit(int x)
  9. {
  10. return x&(-x);
  11. }
  12. void update(int x,int y,int val)
  13. {
  14. for(int i=x;i<=n;i+=lowbit(i))
  15. {
  16. for(int j=y;j<=m;j+=lowbit(j))
  17. {
  18. bit[i][j]+=val;
  19. }
  20. }
  21. }
  22. int sum(int x,int y)
  23. {
  24. int ret=0;
  25. for(int i=x;i>0;i-=lowbit(i))
  26. {
  27. for(int j=y;j>0;j-=lowbit(j))
  28. {
  29. ret+=bit[i][j];
  30. }
  31. }
  32. return ret;
  33. }
  34. int main()
  35. {
  36. int N;
  37. while(scanf("%d",&N) && N)
  38. {
  39. memset(bit,0,sizeof(bit));
  40. scanf("%d%d",&n,&m);
  41. // 建立二维树状数组bit
  42. int x,y;
  43. for(int i=0;i<N;++i)
  44. {
  45. scanf("%d %d",&x,&y);
  46. update(x,y,1);
  47. }
  48. int S,T;
  49. scanf("%d%d",&S,&T);
  50. int ans=-1;
  51. for(int i=1;i<=n-S+1;++i)
  52. {
  53. for(int j=1;j<=m-T+1;++j)
  54. {
  55. int x1,x2,y1,y2;
  56. x1=i;
  57. y1=j;
  58. x2=i+S-1;
  59. y2=j+T-1;
  60. int now=sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1);
  61. //cout<<"??"<<endl;
  62. ans=max(ans,now);
  63. }
  64. }
  65. printf("%d\n",ans);
  66. }
  67. return 0;
  68. }

发表评论

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

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

相关阅读