外星人

来源:互联网 发布:时时彩计划软件免费版 编辑:程序博客网 时间:2024/04/28 08:05

这里写图片描述
这里写图片描述
将有障碍的点赋值为1,然后处理前缀和
然后对于每个A,B跑枚举可能的情况,然后用前缀和来判断区域可不可行,
注意一个问题,如果说正方形,飞船横着竖着没有差别,这时候ans要除以2

#include <cstdio>#include <iostream>using namespace std;int s[1100][1100];int a[1100][1100];int main(){    freopen("alien.in","r",stdin);    freopen("alien.out","w",stdout);    int n,m,p,q;    scanf("%d%d%d%d",&n,&m,&p,&q);    for(int i=1;i<=p;i++)     {        int x,y;        scanf("%d%d",&x,&y);        a[x][y]=1;     }    for(int i=1;i<=n;i++)     for(int j=1;j<=m;j++)      s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];     for(int i=1;i<=q;i++)      {        int x,y;        int ans=0;        scanf("%d%d",&x,&y);        for(int j=1;j<=n;j++)         for(int k=1;k<=m;k++)          {            if(j+x-1<=n&&k+y-1<=m)             {                int p=s[j+x-1][k+y-1]-s[j-1][k+y-1]-s[j+x-1][k-1]+s[j-1][k-1];                if(!p) ans++;             }            if(j+y-1<=n&&k+x-1<=m)             {                int p=s[j+y-1][k+x-1]-s[j-1][k+x-1]-s[j+y-1][k-1]+s[j-1][k-1];                if(!p) ans++;             }          }        if(x==y) ans/=2;        printf("%d\n",ans);      }     return 0;} 
原创粉丝点击