题目:https://www.luogu.org/problemnew/show/P2038
大水题暴露出我的愚蠢。
用二维树状数组,然而居然忘了它应该那样写,调了一个小时;
正方形可以超出外面,只要中心在里面即可。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int const maxn=200; int d,n,t[maxn][maxn],ans,num,mx,my; void add(int x,int y,int v) { // for(;x<=mx;x+=(x&-x)) //for(;y<=my;y+=(y&-y)) for(int i=x;i<=mx+d;i+=(i&-i)) for(int j=y;j<=my+d;j+=(j&-j)) t[i][j]+=v; } int query(int x,int y) { int ret=0; // for(;x;x-=(x&-x)) // for(;y;y-=(y&-y)) for(int i=x;i;i-=(i&-i)) for(int j=y;j;j-=(j&-j)) ret+=t[i][j]; return ret; } int main() { scanf("%d%d",&d,&n); mx=129; my=129; for(int i=1,x,y,k;i<=n;i++) { scanf("%d%d%d",&x,&y,&k); x++; y++; add(x,y,k); } for(int i=d+1;i<=mx+d;i++) for(int j=d+1;j<=my+d;j++) { int x=max(0,i-2*d-1),y=max(0,j-2*d-1); int v=query(i,j)-query(x,j)-query(i,y)+query(x,y); if(v>ans)ans=v,num=1;//! else if(v==ans)num++; } printf("%d %d\n",num,ans); return 0; }