#P17713. Red Face 玩 pvz(game)

Red Face 玩 pvz(game)

背景

题目来源:【HT-122-Div.3】核桃 CSP-J 组模拟赛

Red Face 很喜欢玩 pvz(植物大战僵尸),有一天,它看到了一个不太一样的游戏。

题目描述

注意:本题的僵尸不会动!

在一个 109×10910^9 \times 10^9 的二维平面上,有豌豆射手和僵尸两种单位。规定 xx 坐标增大方向为右,因此两个单位位于同一行,当且仅当它们的 yy 坐标相同。

在一个草地上,每秒 Red Face 都有一次操作:

  • 1 x y:在第 xx 行第 yy 列种植一个豌豆射手。
  • 2 x y z:在第 xx 行第 yy 列放置一个血量为 zz 僵尸。

在这一次操作后,攻击规则如下:

  1. 每个豌豆射手在本轮中只会攻击一次。若其所在行的右边存在僵尸,则它会对右边第一个僵尸造成 11 点伤害。这里的“右边第一个僵尸”,指与该豌豆射手的 yy 坐标相同、xx 坐标大于该豌豆射手,且 xx 坐标最小的僵尸。
  2. 当某个僵尸在本轮被打死,即血量降至 00 或更低时:
    • 该僵尸会立即消失;
    • 若攻击该僵尸的次数超过了它被攻击前的剩余血量,则超过的攻击会在同一轮继续顺延,攻击其右边的下一个僵尸;若下一个僵尸也被打死,则多余的攻击会继续向右顺延;
    • 已经完成攻击的豌豆射手在本轮中不会再次攻击。从下一轮开始,它们会改为攻击其右边新的第一个僵尸。
  3. 每轮攻击只执行一次。攻击结束后,输出当前所有存活僵尸血量的异或和。

输入格式

第一行输入一个数 qq 表示操作次数。

接下来的 qq 行输入三个或四个数,表示一次操作。

输出格式

对于每次操作,在攻击结束后输出一行一个整数,表示当前所有存活僵尸的血量异或和。

当所有操作执行完毕后,输出所有仍存活的单位:

  • 豌豆射手输出:1 x y。
  • 僵尸输出:2 x y z,其中 zz 为其剩余血量。

输出顺序要求如下:

  1. 所有豌豆射手在前;
  2. 同类单位按 xx 升序;
  3. 若 xx 相同,则按 yy 升序。
3
1 1 2
2 3 2 24
1 2 2
0
23
21
1 1 2
1 2 2
2 3 2 21
10
2 1 1 50
2 3 1 50
1 2 1
1 4 1
1 5 1
2 8 1 50
1 7 1
1 6 1
2 1 2 50
1 2 2
50
0
3
2
29
44
50
55
14
11
1 2 1
1 2 2
1 4 1
1 5 1
1 6 1
1 7 1
2 1 1 50
2 1 2 50
2 3 1 42
2 8 1 33
4
2 4 1 4
1 2 1
1 3 1
2 8 1 2
4
3
1
1
1 2 1
1 3 1
2 8 1 1

提示

样例解释

对于样例 11:

  • 第一秒:在 (1,2)(1,2) 处种植了一个豌豆射手,没有僵尸,所以豌豆射手不攻击。
  • 第二秒:在 (3,2)(3,2) 处放置了一个僵尸,此时豌豆射手攻击一次僵尸,僵尸血量为 24−1=2324-1=23。
  • 第三秒:在 (2,2)(2,2) 处放置了一个豌豆射手,此时两个豌豆射手各攻击一次僵尸,僵尸血量为 23−2=2123-2=21。

:::info[对于样例 22:]

  1. 在 (1,1)(1,1) 处放置了一个血量为 5050 的僵尸,血量异或和为 5050。
  2. 在 (3,1)(3,1) 处放置了一个血量为 5050 的僵尸,血量异或和为 50⊕50=050 \oplus 50=0。
  3. 在 (2,1)(2,1) 处放置了一个豌豆射手,这个豌豆射手攻击了 (3,1)(3,1) 处的僵尸,血量异或和为 50⊕49=350 \oplus 49=3。
  4. 在 (4,1)(4,1) 处放置了一个豌豆射手,(2,1)(2,1) 处豌豆射手攻击了 (3,1)(3,1) 处的僵尸,血量异或和为 50⊕48=250 \oplus 48=2。
  5. 在 (5,1)(5,1) 处放置了一个豌豆射手,(2,1)(2,1) 处豌豆射手攻击了 (3,1)(3,1) 处的僵尸,血量异或和为 50⊕47=2950 \oplus 47=29。
  6. 在 (8,1)(8,1) 处放置了一个血量为 5050 的僵尸,(2,1)(2,1) 处豌豆射手攻击了 (3,1)(3,1) 处的僵尸,(4,1),(5,1)(4,1),(5,1) 处豌豆射手各攻击了 (8,1)(8,1) 处的僵尸,血量异或和为 50⊕46⊕48=4450 \oplus 46 \oplus 48=44。
  7. 在 (7,1)(7,1) 处放置了一个豌豆射手,(2,1)(2,1) 处豌豆射手攻击了 (3,1)(3,1) 处的僵尸,(4,1),(5,1),(7,1)(4,1),(5,1),(7,1) 处豌豆射手各攻击了 (8,1)(8,1) 处的僵尸,血量异或和为 50⊕45⊕45=5050 \oplus 45 \oplus 45=50。
  8. 在 (6,1)(6,1) 处放置了一个豌豆射手,(2,1)(2,1) 处豌豆射手攻击了 (3,1)(3,1) 处的僵尸,(4,1),(5,1),(6,1),(7,1)(4,1),(5,1),(6,1),(7,1) 处豌豆射手各攻击了 (8,1)(8,1) 处的僵尸,血量异或和为 50⊕44⊕41=5550 \oplus 44 \oplus 41=55。
  9. 在 (1,2)(1,2) 处放置了一个血量为 5050 的僵尸,(2,1)(2,1) 处豌豆射手攻击了 (3,1)(3,1) 处的僵尸,(4,1),(5,1),(6,1),(7,1)(4,1),(5,1),(6,1),(7,1) 处豌豆射手各攻击了 (8,1)(8,1) 处的僵尸,血量异或和为 50⊕43⊕37⊕50=1450 \oplus 43 \oplus 37 \oplus 50=14。
  10. 在 (2,2)(2,2) 处放置了一个豌豆射手,(2,1)(2,1) 处豌豆射手攻击了 (3,1)(3,1) 处的僵尸,(4,1),(5,1),(6,1),(7,1)(4,1),(5,1),(6,1),(7,1) 处豌豆射手各攻击了 (8,1)(8,1) 处的僵尸,血量异或和为 50⊕42⊕33⊕50=1150 \oplus 42 \oplus 33 \oplus 50=11。 :::

对于样例 33:

请注意:僵尸如果在某一轮被打死了,它左边如果还有豌豆会打到其右边的僵尸上。

数据规模与约定

本题采用捆绑测试和子任务依赖。

::cute-table{tuack} | 子任务 | q≤q\le | x,y≤x,y\le | 特殊性质 | 分值 | 子任务依赖 | | :----: | :----: | :------: | :------: | :--: | :--------: | | 00 | 10510^5 | 10910^9 | A | 00 | 无 | | 11 | 1010 | 88 | 无 | 1818 | 无 | | 22 | 10001000 | 10001000 | ^ | 1212 | 11 | | 33 | ^ | 10910^9 | ^ | 1212 | 1,21,2 | | 44 | 10510^5 | 10001000 | ^ | 66 | 1,21,2 | | 55 | ^ | 10910^9 | B | 99 | 11 | | 66 | ^ | ^ | C | 99 | 11 | | 77 | ^ | ^ | 无 | 3434 | 0∼60 \sim 6 |

特殊性质:

  • AA:是样例。
  • BB:豌豆射手不超过 1010 个。
  • CC:僵尸不超过 1010 个。

对于 100%100\% 的数据,保证:

  • 1≤x,y≤1091 \le x,y \le 10^9
  • 1≤z≤501 \le z \le 50
  • 1≤q≤1051 \le q \le 10^5
  • 豌豆射手和僵尸的坐标互不相同。