树状数组或二叉索引树 其初衷是解决数据压缩里的累积频率的计算问题,现多用于高效计算数列的前缀和、区间和。
它可以以的时间得到任意前缀和
,并同时支持在{
时间内支持动态单点值的修改。空间复杂度
。
#include <bits/stdc++.h> using namespace std; int map1[1005][1005]; int m,n; inline int lowbit(int k) { return k&(-k); } void add(int x,int y,int vay)//更新(x,y) { for(int i=x; i<=m; i+=lowbit(i)) { for(int j=y; j<=n; j+=lowbit(j)) { map1[i][j]+=vay; } } } int sum(int x,int y)//求和 { int s=0; for(int i=x; i>0; i-=lowbit(i)) { for(int j=y; j>0; j-=lowbit(j)) { s+=map1[i][j]; } } return s; } int main() { int t; scanf("%d",&t); while(t--) { int tmp1,x,y,ans,res; scanf("%d %d %d %d",&m,&n,&x,&y); memset(map1,0,sizeof(map1)); for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) { scanf("%d",&tmp1); add(i,j,tmp1); } } ans=0; res=0; for(int i=1; i<=m-x+1; i++)//注意+1 { for(int j=1; j<=n-y+1; j++) { res=sum(i+x-1,j+y-1)-sum(i-1,j+y-1)-sum(i+x-1,j-1)+sum(i-1,j-1); ans=max(ans,res); } } cout<<ans<<‘\n‘; } return 0; }
原文:https://www.cnblogs.com/guanwen769aaaa/p/10350501.html