Ice_lift^_^
Ice_lift^_^
发布于 2024-10-16 / 177 阅读
0
0

10.16 模拟赛

T2 蛇形数组

Problem:

原题面

给定一个无限大的网格,在网格里蛇形填数。形如:

..... 13
5 4 3 12
6 1 2 11
7 8 9 10

现在令 (x, y) 表示第 x 行,第 y 列,第一个数的坐标为 (0, 0)

然后每次删去 (x, y) 位置的数,让比其大的数向前补位,每次删去的是哪一个数?

假如删除 (1, 0),变化为:

..... 14
6 5 3 13
7 1 2 12
8 9 10 11

Solution 看起来没有问题的赛时思路

可以通过 (x, y) 快速得到对应的值。

然后就可以通过这个定义 (x_1, y_1)(x_2, y_2) 的大小关系

对于一个询问 i,最终答案就是 \sum_{j=1}^{i - 1} [v_i \ge v_j]

x \ y-3-2-10123
337363534333231
238171615141330
139185431229
040196121128
-141207891027
-242212223242526
-343444546474849

层数: \max(|x|, |y|)

int getpos (int x, int y) {
	if(x == 0 && y == 0) return 1; 
	int dep = max(abs(x), abs(y));
	int start = (dep * 2 - 1) * (dep * 2 - 1);
	if(abs(x) == dep) {
		if(x < 0) {
//			cout << "Down\n";
			return start + dep * 6 - 1 + y - (-dep) + 1; 
		} else {
//			cout << "Up\n";
			return start + dep * 2 - 1 + dep - y + 1;
		}
	} else {
		if(y < 0) {
//			cout << "Left\n";
			return start + dep * 4 - 1 + dep - x + 1;
		} else {
//			cout << "Right\n";
			return start + x - (-dep);
		}
	}
}

评论