舒适的奶牛

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;
} 

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/125102798