2021ICPC山东省赛 D.Dyson Box(模拟)

传送门

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

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

猜你喜欢

转载自blog.csdn.net/laysan/article/details/121406355