题目描述
输入描述
输出描述
输入样例
4
1 2
3 2
2 1
4 1
输出样例
4 4
8 6
8 8
10 8
样例说明
题目大意: 在一个重力方向可能向下或向左的二维空间内依次放入 n 个边长为 1 的方块,求每次放入一个方块后,按两种不同的重力方向所得到的方块状态中,围绕这些方块的外轮廓线长度分别为多少。
模拟即可,采用 map 存储两种重力方向的结果。例如 ver [ x ] ++ 说明在重力方向向下的情况中,处于下标在 x - 1 ~ x 之间的方块的个数加一,hor [ y ] ++ 说明在重力方向向左的情况中,处于下标在 y - 1 ~ y 之间的方块的个数加一。
可以发现边数的增加和减少与新增方块的三个方向是否有方块有关,每个方块的初始贡献长度为 4 ,若三个方向中任一方向存在方块,则贡献值减 2 ,累加即可。
参考代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
map<int,int> ver;//x轴
map<int,int> hor;//y轴
int main(){
int n;
cin>>n;
int x1,y1;
ll heng=0,shu=0;
while(n--){
int x,y;
cin>>x>>y;
ver[x]++;
hor[y]++;
x1=4;
y1=4;
if(ver[x]>1)
x1-=2;
if(hor[y]>1)
y1-=2;
if(ver[x-1]>=ver[x])
x1-=2;
if(ver[x+1]>=ver[x])
x1-=2;
if(hor[y+1]>=hor[y])
y1-=2;
if(hor[y-1]>=hor[y])
y1-=2;
heng+=x1;
shu+=y1;
cout<<heng<<" "<<shu<<endl;
}
return 0;
}