#P9746. 「KDOI-06-S」合并序列

    ID: 8818 远端评测题 1000ms 125MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>动态规划,dp2023洛谷原创Special JudgeO2优化区间 dp位运算洛谷月赛

「KDOI-06-S」合并序列

题目描述

给定一个长度为 nn 的序列 a1,a2,ana_1,a_2,\ldots a_n

你可以对这个序列进行若干(可能为 00)次操作。在每次操作中,你将会:

  • 选择三个正整数 i<j<ki<j<k,满足 aiajak=0a_i\oplus a_j\oplus a_k=0kk 的值不超过此时序列的长度。记 s=aiai+1aks=a_i\oplus a_{i+1}\oplus \cdots\oplus a_k
  • 然后,删除 aiaka_i\sim a_k,并在原来这 ki+1k-i+1 个数所在的位置插入 ss。注意,此时序列 aa 的长度将会减少 (ki)(k-i)

请你判断是否能够使得序列 aa 仅剩一个数,也就是说,在所有操作结束后 aa 的长度为 11。若可以,你还需要给出一种操作方案。

输入格式

从标准输入读入数据。

本题含有多组测试数据。

输入的第一行包含一个正整数 TT,表示数据组数。

对于每组测试数据,第一行一个正整数 nn,表示初始序列长度。

第二行 nn 个整数 a1,a2,,ana_1,a_2,\ldots,a_n,表示初始序列中每个元素的值。

输出格式

对于每组测试数据:

  • 若存在一种方案使得序列 aa 仅剩一个数,请在输出的第一行输出 Huoyu
    • 接下来,在第二行你应该输出一个非负整数 tt,表示你的操作次数。你需要保证 0tn0\le t\le n
    • 接下来 tt 行,每行输出三个正整数 i,j,ki,j,k,表示你在这次操作中选择的三个数的值。你需要保证 i<j<ki<j<kkk 的值不超过此时序列的长度。
  • 否则,请输出一行一个字符串 Shuiniao
2
5
3 3 1 4 5
9
3 4 6 5 4 5 1 2 4
Huoyu
2
3 4 5
1 2 3
Huoyu
3
1 3 4
2 3 4
1 2 4

提示

【样例解释 #1】

对于第一组测试数据:

  • 第一次操作中,a3a4a5=145=0a_3\oplus a_4\oplus a_5=1\oplus4\oplus5=0,操作后的序列为 [3,3,0][3,3,0]
  • 第二次操作中,a1a2a3=330=0a_1\oplus a_2\oplus a_3=3\oplus3\oplus0=0,操作后的序列为 [0][0]

于是,序列 aa 在两次操作后仅剩一个数。

对于第二组测试数据:

  • 第一次操作,a1a3a4=365=0a_1\oplus a_3\oplus a_4=3\oplus6\oplus5=0s=4s=4,操作后的序列为 [4,4,5,1,2,4][4,4,5,1,2,4]
  • 第二次操作,a2a3a4=451=0a_2\oplus a_3\oplus a_4=4\oplus5\oplus1=0,操作后的序列为 [4,0,2,4][4,0,2,4]
  • 第三次操作,a1a2a4=404=0a_1\oplus a_2\oplus a_4=4\oplus0\oplus4=0s=2s=2,操作后的序列为 [2][2]

于是,序列 aa 在三次操作后仅剩一个数。

【样例 #2】

见选手目录下的 merge/merge2.inmerge/merge2.ans

这个样例满足测试点 676\sim7 的条件限制。

【样例 #3】

见选手目录下的 merge/merge3.inmerge/merge3.ans

这个样例满足测试点 121312\sim13 的条件限制。

【数据范围】

对于所有数据保证:1T201\leq T\leq201n5001\leq n\leq5000ai<5120\leq a_i<512

测试点编号 nn n\sum n\leq ai<a_i<
11 =1=1 2020 512512
22 =2=2 4040
33 =3=3 6060
44 =4=4 8080
55 =5=5 100100
676\sim7 40\leq40 800800
898\sim9 70\leq70 1 4001~400
101110\sim11 130\leq130 2 6002~600
121312\sim13 300\leq300 6 0006~000 128128
141514\sim15 500\leq500 3 0003~000 6464
161716\sim17 128128
182018\sim20 10 00010~000 512512

【提示】

\oplus 表示按位异或运算。

请对程序的常数以及效率给予充分的信任。