#TT20251017. 你也喜欢深度学习吗?1

你也喜欢深度学习吗?1

题目描述

在深度学习中,张量(多维数组)的形状变化是非常常见且重要的操作。为了帮助初学者更好地理解各种张量操作,本题要求你模拟一个简单的深度学习网络中张量形状的变化过程。

张量本质上是一个多维数组,但是它的shape可以用一个一维数组表示。

本题重点讨论的是张量的shape。

网络共包含 n 层,每一层都是一个计算层,用于对输入张量进行变换。最开始,网络接收一个一维向量,长度为 m(即形状为 [m])。之后,每一层会对当前张量执行下列五种操作之一(输入时每一层给出一个字符串表示操作和参数):

  1. reshape k a1 a2akreshape \ k \ a_1 \ a_2 \dots a_k 将当前张量重塑为形状为 (a₁, a₂, ..., aₖ) 的张量,要求新形状各维度的乘积必须等于mm。若不满足,则视为非法操作。
  2. transpose d p1 p2pdtranspose \ d \ p_1 \ p_2 \dots p_d 将当前张量的维度按照给定顺序 p₁, p₂, ..., p_d 进行置换,其中 d 为当前张量的维数,且 (p₁, p₂, ..., p_d){1, 2, ..., d} 的一个排列。 例如,若当前张量形状为 (2, 3, 4),执行 transpose 3 1 2 后,张量形状变为 (4, 2, 3)
  3. flattenflatten 将当前张量展平为一个一维向量,其长度为当前张量所有维度之积。 例如,形状 (4, 2, 3) 经 flatten 后变为 (24)

如果在某一层中操作不合法(例如,reshape 的新形状乘积与原张量元素总数不等,或transpose的维度数量必须与上一个操作后的向量维度不对应),则该层以及后续层都不再执行,且所有后续的查询输出均为 INVALID

网络执行完毕后,你将收到 q 个查询,每个查询给出一个整数 x,表示询问网络经过前 x 层后张量的形状(注意:x = 0 表示查询初始张量的形状)。

格式

输入格式

  • 第一行输入三个整数:nqm1n103,qn,m1091 \leq n\le10^3,q \le n, m \le 10^9),分别表示网络层数、查询次数和初始向量的长度。
  • 接下来的 n 行,每行描述一层的操作,格式为上述三种操作之一,其中,0k4,1ai,pi1020 \le k \le 4,1 \le a_i,p_i \le 10^2
  • 接下来的 q 行,每行包含一个整数 x0xn0 \le x \le n),表示查询网络经过前 x 层之后张量的形状。

输出格式

输出 qq 行,每行都输出向量 xx 的形状(输出时多个整数间用空格隔开,并且按照顺序输出),非法状态就输出INVALID

样例

3 4 24
reshape 3 2 3 4
transpose 3 3 1 2
flatten
0
1
2
3
24
2 3 4
4 2 3
24

样例解释

  • 初始张量:形状为 [24](即一个长度为 24 的一维向量)。
  • 第 1 层reshape 2 3 4[24] 变为 (2, 3, 4)(满足 2×3×4=24)。
  • 第 2 层transpose 3 1 2(2, 3, 4) 置换为 (4, 2, 3)
  • 第 3 层flatten(4, 2, 3) 展平为一维向量 (24)