生命(哈密尔顿距离&切比雪夫距离+前缀和)


p1

  数据

题目大意:   已经很简洁了

题解:

  对于每个询问,暴力枚举老蛤的位置,\(O(1)\) 统计答案
  
  那么对着原图斜着维护前缀和就行了
  
  或者将曼哈顿距离转换成切比雪夫距离
  
  统计正方形区域前缀和
  
  注意方案中枚举的老蛤的位置要再原图内


AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=2e3+5;
int n,K,Q,s,ans;
int a[N][N];
inline int read(){
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
int main(){
    n=read();K=read();Q=read();
    for(int i=1;i<=K;i++){
        int x=read(),y=read();
        a[x+y+1][x-y+n+1]++;
    }
    int mx=(n<<1)+1;
    for(int i=1;i<=mx;i++)
        for(int j=1;j<=mx;j++)
            a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
    while(Q--){
        int s=min(read(),n+n);
        ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                int x=i+j+1,y=i-j+n+1;
                ans=max(ans,a[min(x+s,mx)][min(y+s,mx)]-a[min(x+s,mx)][max(y-s-1,0)]-a[max(x-s-1,0)][min(y+s,mx)]+a[max(x-s-1,0)][max(y-s-1,0)]);
            }
        printf("%d\n",ans);
    }
    return 0;
}


  作者:skl_win
  出处:https://www.cnblogs.com/shaokele/
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

猜你喜欢

转载自www.cnblogs.com/shaokele/p/9464107.html