Farmer John 的草地可以被看作是一个由正方形方格组成的巨大的二维方阵(想象一个巨大的棋盘)。
初始时,草地上是空的。
Farmer John 将会逐一地将 N 头奶牛加入到草地上。
第 ii 头奶牛将会占据方格 (xi,yi),不同于所有已经被其他奶牛占据的方格。
一头奶牛被称为是「舒适的」,如果它水平或竖直方向上与恰好三头其他奶牛相邻。
Farmer John 对他的农场上舒适的奶牛数量感兴趣。
对 1…N 中的每一个 i,输出第 i 头奶牛加入到草地上之后舒适的奶牛的数量。
输入格式
输入的第一行包含一个整数 N。
以下 N 行每行包含两个空格分隔的整数,表示一头奶牛所在的方格坐标 (xi,yi)。
输入保证所有方格的坐标是不同的。
输出格式
输出的第 i 行包含前 i 头奶牛加入到草地上之后舒适的奶牛的数量。
数据范围
1≤N≤10^5
0≤xi,yi≤1000
输入样例:
8
0 1
1 0
1 1
1 2
2 1
2 2
3 1
3 2
输出样例:
0
0
0
1
0
0
1
2
样例解释
在前四头奶牛加入之后,位于 (1,1) 的奶牛是舒适的。
在前七头奶牛加入之后,位于 (2,1) 的奶牛是舒适的。
在前八头奶牛加入之后,位于 (2,1) 和 (2,2) 的奶牛是舒适的。
源代码
0 1
1 0
1 1
1 2
2 1
2 2
3 1
3 2
#include <iostream>
using namespace std;
const int N = 1000;
int a[N][N],b[N][N];//a数组用于标记哪儿有牛,b数组用于标记哪儿个位置周围有几头牛
int dx[4]={-1,0,1,0};//偏移量数组x
int dy[4]={0,1,0,-1};//偏移量数组y
int ans=0;//答案数初始化
void deal(int x,int y)//进行临近位置查询,查询临近位置的牛牛
{
for(int i = 0;i < 4;i ++ )//依次对于上右下左位置的牛牛的临近牛牛数进行操作
{
int flag=0;
int xx=x+dx[i];
int yy=y+dy[i];
if(b[xx][yy]==3)flag=1;//如果此位置临近有3头牛,进行答案数的变换预处理flag=1
b[xx][yy]+=1;
if(b[xx][yy]==4&&flag&&a[xx][yy]==1)ans--;//如果此位置进行加一操作之后临近牛牛为4头,即答案数要减一
if(b[xx][yy]==3&&a[xx][yy]==1)ans++;//如果此位置临近牛牛数为3且此位置有牛牛占据
}
}
int main()
{
//对于cin,cout进行优化提速
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
while(n--)
{
int x,y;
cin>>x>>y;
a[x][y]=1;//标记牛牛出现过的位置
if(b[x][y]==3)ans++;//若此位置有三头牛临近,答案加一
deal(x,y);//进行临近位置查询
cout<<ans<<endl;//输出答案
}
return 0;
}