题目描述
Farmer John 的草地可以被看作是一个由正方形方格组成的巨大的二维方阵(想象一个巨大的棋盘)。
初始时,草地上是空的。
Farmer John 将会逐一地将 N 头奶牛加入到草地上。
第 i 头奶牛将会占据方格 (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) 的奶牛是舒适的。
算法
blablabla
时间复杂度
参考文献
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int d[N][N],g[N][N],cnt;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int main(){
int n,i,j;
cin>>n;//输入n个奶牛
while(n--){
cin>>i>>j;//输入奶牛位置
d[i][j]++;//把奶牛所在位置舒适度记作1
g[i][j]=1;//表示当前位置i,j有奶牛
for(int m=0;m<4;m++){//把i,j四周舒适度都+1
int a=i+dx[m],b=j+dy[m];
if(a>=0&&a<=1000&&b>=0&&b<=1000){
d[a][b]++;
if(d[a][b]==4&&g[a][b]) cnt++;//当一个格子舒适度为4且中间有奶牛说明此奶牛很舒适,加一
if(d[a][b]==5) cnt--;//当一个格子舒适度为5说明原来舒适的奶牛不舒适了,减一
}
}
cout<<cnt<<endl;//输出当前舒适奶牛数
}
return 0;
}