#P9054. [集训队互测 2022] 心跳排列图

    ID: 8083 远端评测题 1000ms 2048MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>动态规划,dp贪心WC/CTSC/集训队2022Special JudgeO2优化构造Ad-hoc分类讨论

[集训队互测 2022] 心跳排列图

题目背景

下发文件见附件。

题目描述

注:本题中所有序列下标均从 1 开始。

机器人心脏的跳动,排列成图是什么样的?

你有一个算法竞赛机器人,每分钟心跳 nn 次,第 ii 次心跳的强度为 aia_i。这里,a1ana_1\sim a_n 恰为 1n1\sim n 的一个排列。

AiA_i 为序列 aa 删除第 ii 个元素后得到的序列,即 Ai=[a1,,ai1,ai+1,,an]A_i=[a_1,\dots,a_{i-1},a_{i+1},\dots,a_n]

对于元素互不相同的序列 pp,设 G(p)G(p) 为一个无向图,有 p|p| 个点,编号为 1p1\sim |p|。对于每对正整数 1i<jp1\le i\lt j\le |p|,若 k[i,j]Z\forall k\in [i,j]\cap \mathbb{Z},都有 pk[min(pi,pj),max(pi,pj)]p_k\in [\min(p_i,p_j),\max(p_i,p_j)],则 G(p)G(p)ii 号点和 jj 号点有一条边。设 F(p)F(p)G(p)G(p)11 号点到 p|p| 号点的最短路长度,这里一条路径长度定义为其边数。

f(a)=[F(A1),F(A2),,F(An)]f(a)=[F(A_1),F(A_2),\dots,F(A_n)]

给定长度为 nn 的序列 [b1,,bn][b_1,\dots,b_n],请你求出任意一个 1n1\sim n 的排列 aa,使得 f(a)=bf(a)=b保证有解。

在某些子任务中,算法竞赛机器人小 G 会给你一些“提示”:设 G0=G(a)G_0=G(a),设 path0path_0G0G_0 中某条 11nn 的最短路经过的点构成的集合,设 pathjpath_jG(Aj)G(A_j) 中某条起始点到结束点的最短路经过的点构成的集合(注意,为了方便,这里给出的 pathjpath_j 中点的编号仍然沿用原图中点的编号,参见样例 2)。则小 G 有可能会额外告诉你所有 pathjpath_j(包括 path0path_0),也有可能只告诉你 path0path_0,也有可能不给你提示,详见输入格式。

保证给出的提示是正确的,也即一定存在一个满足所有提示的排列。

下发文件中有 checker.cpp,你可以用它来检查自己的输出是否正确。用法是 ./checker input output outputinputoutput 分别为输入文件和你的输出。同时还下发了 testlib.h,请将其和 checker 置于同一目录下来编译 checker。

输入格式

第一行两个正整数,为子任务编号 SS 以及数据组数 TT

接下来 TT 组数据,每组数据格式为:第一行一个正整数 nn,第二行 nn 个正整数 b1,,bnb_1,\dots,b_n

特别地,

  1. S=5S=5,每组数据还会输入 n+1n+1 行,这 n+1n+1 行里第 ii 行是一个长度为 nn 的 01 串 cic_ici,j=[jpathi1]c_{i,j}=[j\in path_{i-1}]
  2. S=6S=6,每组数据还会输入第三行,包含一个长度为 nn 的 01 串 ccci=[ipath0]c_i=[i\in path_0]

注意:

  1. 即使你的程序不需要用到提示,在 S=5S=5S=6S=6 时你仍然需要读入数组 cc
  2. 对于一种输入的 bb,符合条件的 aa 可能不唯一,进而 cc 可能也不唯一。不要求你的输出符合我们给出的 cc 的限制,只要符合 bb 的限制即视为正确。

同一行输入的不同变量用一个空格隔开。

输出格式

对于每组数据输出一行 nn 个正整数,为你求出的排列 aa

9 11
4
2 2 1 1
4
2 2 2 2
4
2 1 1 2
7
5 5 4 4 4 5 5
7
1 3 2 2 2 2 4
7
3 3 2 4 4 5 3
8
2 2 3 5 3 3 3 4
8
5 4 4 4 4 6 6 5
8
4 4 4 2 4 4 2 3
9
4 7 5 5 5 5 3 4 4
9
3 4 4 4 4 4 4 4 6
1 2 4 3
2 1 4 3
1 3 2 4
3 1 7 2 6 4 5
3 1 6 4 2 5 7
2 3 1 6 4 7 5
5 6 3 1 7 4 2 8
1 8 2 7 3 5 6 4
6 3 2 7 4 5 1 8
5 8 6 3 7 1 9 2 4
2 9 3 1 8 5 7 6 4
5 1
4
2 2 1 1
1011
0111
1011
1001
1010
1 2 4 3
6 1
4
2 2 1 1
1011
1 2 4 3

提示

样例 1 解释

考虑样例中的第一组数据。一组解是 a=[1,2,4,3]a=[1,2,4,3]A1,A2,A3,A4A_1,A_2,A_3,A_4 分别为 [2,4,3],[1,4,3],[1,2,3],[1,2,4][2,4,3],[1,4,3],[1,2,3],[1,2,4]G(A1),G(A2),G(A3),G(A4)G(A_1),G(A_2),G(A_3),G(A_4) 四个图中的边分别为:

  • G(A1)G(A_1)(1,2),(2,3)(1,2),(2,3)。因此 F(A1)=2F(A_1)=2
  • G(A2)G(A_2)(1,2),(2,3)(1,2),(2,3)。因此 F(A2)=2F(A_2)=2
  • G(A3)G(A_3)(1,2),(1,3),(2,3)(1,2),(1,3),(2,3)。因此 F(A3)=1F(A_3)=1
  • G(A4)G(A_4)(1,2),(1,3),(2,3)(1,2),(1,3),(2,3)。因此 F(A4)=1F(A_4)=1

所以 f(a)=[2,2,1,1]f(a)=[2,2,1,1],符合输入。

符合输入的 aa 不唯一,比如 a=[4,3,1,2]a=[4,3,1,2] 也是正确的。

样例 2 解释

该样例的排列和第一个样例中第一组数据是相同的,但本样例存在子任务 5 的提示。注意在给出 pathjpath_j 时仍然沿用原编号,例如删去 11 后,新的最短路经过的点编号为 2342\to 3\to 4

样例 3 解释

该样例的排列和第一个样例中第一组数据是相同的,但本样例存在子任务 6 的提示。

数据范围

对于所有数据:$1\le T\le 4\times 10^4,4\le n\le 10^5,\sum n\le 5\times 10^5$。

  • 子任务 1(77 分)T250,n7T\le 250,n\le 7
  • 子任务 2(55 分)bi=1b_i=1
  • 子任务 3(1010 分)n90000n\ge 90000,保证存在一组解满足 a1=1,an=na_1=1,a_n=n
  • 子任务 4(77 分)n90000n\ge 90000,保证存在一组解满足 a2=1,an1=na_2=1,a_{n-1}=n
  • 子任务 5(1515 分)n100,n33×106n\le 100,\sum n^3\le 3\times 10^6,存在所有 pathjpath_j 的提示。
  • 子任务 6(1515 分)n100,n33×106n\le 100,\sum n^3\le 3\times 10^6,存在 path0path_0 的提示。
  • 子任务 7(1515 分)n=100,T=3n=100,T=3,共 5 个测试点,输入生成方式是随机一个 aa 再求出 f(a)f(a) 作为输入。
  • 子任务 8(2525 分)n100,n33×106n\le 100,\sum n^3\le 3\times 10^6
  • 子任务 9(11 分)无特殊限制。