#P51092. 「2019 集训队互测 Day 1」学习轨迹

「2019 集训队互测 Day 1」学习轨迹

题目描述

马上就要比赛了,小 D 决定突击学习一些算法。

他要学习的算法共有 nn 个,这些算法被依次标号为 1,2,,n1,2,\cdots,n

小 D 根据学习难度以及实用价值等方面,给每个算法定了一个价值。其中,编号为 ii 的算法的价值是 wiw_i

小 D 想要以某种顺序学完所有的这 nn 个算法。我们把他学习的顺序可以看做一个 1,2,,n1,2,\cdots,n 的排列 pp,其中第 iipip_i 表示第 ii 个学习的算法的编号。

小 D 不希望连续学习的算法之间价值差异过大。对于一种学习方案,他定义这种方案的代价为相邻两个学习的算法的价值差之和。形式化地,对于排列 pp,我们定义他的权值 w(p)w(p) 为:

w(p)=i=1n1wpiwpi+1w(p)=\sum_{i=1}^{n-1}\left \lvert w_{p_i}-w_{p_{i+1}} \right \rvert

但是,小 D 很快发现了一些问题:有的算法之间具有依赖关系,例如学习 LCT 需要先学习 Splay。小 D 把这些算法分成了两类:基础算法和延伸算法

基础算法共有 mm 个,为了方便,小 D 把它们编号为 1,2,,m1,2,\cdots,m;延伸算法是剩下的 nmn-m 个算法,编号为 m+1,m+2,,nm+1,m+2,\cdots,n

对于每个延伸算法 i(m+1in)i(m+1\le i\le n),该算法会依赖恰好一个基础算法,记作 ui(1uim)u_i(1\le u_i\le m)。即,算法 ii 必须要在算法 uiu_i 之后学习

小 D 想要知道,在所有满足这些依赖关系的学习序列 pp 中,w(p)w(p) 最小的那一个

因为小 D 还没开始学这 nn 个算法,所以他并不会算。请你帮他求出 w(p)w(p) 的最小值,以及一个取到该最小值的排列 pp

输入格式

从标准输入读入数据。

第一行包括两个空格隔开的整数 n,mn,m,分别表示算法的总数,基础算法的个数。

第二行包括 nn 个空格隔开的整数,其中第 ii 个数 wiw_i 表示算法 ii 的价值。

第三行包括 nmn-m 个空格隔开的整数,其中第 ii 个数 um+iu_{m+i} 表示延伸算法 m+im+i 依赖的算法的编号。

输出格式

输出到标准输出。

第一行包括一个整数,表示 w(p)w(p) 的最小值。

第二行包括 nn 个空格隔开的整数,其中第 ii 个数 pip_i 表示最优解中,第 ii 个学习的算法编号。

可以证明,在题目的限制下,小 D 一定可以学完所有的算法,即合法的 pp 一定存在。如果有多个使 w(p)w(p) 取最小值的合法的 pp,你可以输出其中任意一个。

样例

6 2
1 3 2 4 5 6
2 2 1 1
7
2 3 1 4 5 6

数据范围与提示

评分方式

对于每组测试数据,若你输出的 w(p)w(p) 是正确的,则你可以得到该测试点 60%60\% 的分数。

此外,若你输出的排列 pp 是一组可以使 w(p)w(p) 取最小值的合法方案,则你可以得到该测试点剩余 40%40\% 的分数。

请注意,即使对于某些测试点,你可能只想要得到部分分,但是你仍然需要严格按照输出格式进行输出。

子任务

对于所有测试数据,1n1061\le n\le 10^{6}1mn1\le m\le n1wi10121\le w_i\le 10^{12}1uim(m+1in)1\le u_i\le m(m+1\le i\le n)

本题共 77 个子任务,对于每个子任务,你的得分为你在该子任务中所有测试数据上得分的最低者。

各子任务的特殊限制见下表:

子任务编号 分值 nn 特殊限制
11 55 105\le 10^5 m=nm=n
22 55 10\le 10
33 1010 20\le 20
44 1010 105\le 10^5 1in,wi10\forall 1\le i\le n,w_i\le 10
55 3030 5000\le 5000
66 2020 105\le 10^5
77 2020 106\le 10^6