A21382.旅行
NOI/NOI+/CTSC
通过率:0%
时间限制:1.00s
内存限制:128MB
题目描述
在遥远的 HX 国,住着一个旅行家小 L,他希望骑着他的自行车游遍全国。在这个国家中,每个城市都有一个编号,共有 n 个城市,编号从 1 到 n。
有的城市没有小 L 想去的景点,而有的城市有且仅有一个小 L 想去的景点,所有的城市都是这两种情况之一,小 L 非常热爱信息学,他编写程序给他的旅行安排了一条最短路线以到达所有他想去的景点(所有的通知旅行线路上城市编号是乱序的):他第 1 个到达的城市编号为 a1,第 i 个到达的城市编号为 ai,最后到达城市 an 结束这次旅行。小L希望用恰好的 m 个月(m<n)的时间完成这次旅行,所以他需要制定一个理性的旅游计划。
当他抵达一个城市时,如果这个城市有他想要去的景点,他会因此获得 1 点快乐值;但是若到达的城市没有他想去的景点,他会因旅途的疲惫得到 1 点的疲劳值:一个月的时间足够他游玩任意多个城市,但他也希望拿出一点时间来休息。他每个月总是在本月所到达的最后一个城市休息(但如果这个城市有景点,那么小 L 总会游玩这个景点再休息)。当然,小 L 希望每个月都能有一定的旅行任务。即便这个月他所到达的城市中并没有他想去的的景点,换句话说,每个月他都会至少到达一个新的城市。
小 L 无法自己安排旅行计划,所以求助于你。你需要告诉他一个序列:x1,x2,…,xm,其中 xi 表示小 L 第 i 个月休息时。他所在的城市编号:由于他最后一个月必须完成他的旅行,所以 xm 肯定等于 an,例如,设 n=5,m=3,(a1,a2,a3,a4,a5)=(3,2,4,1,5),(x1,x2,x3)=(2,1,5),这意味着:第 1 个月先后到达 3 号和 2 号城市,并在 2 号城市休息:第 2 个月先后到达 4 号和 1 号城市,并在 1 号城市休息:第 3 个月到达 5 号城市,并在 5 号城市休息。
这样的方案序列有很多种,设每种方案序列中第 i 个月旅行中当月获得的快乐值与疲劳值的差绝对值为 di,设第 k 种方案序列中求出的 d1,d2,…,dm 这个 m 值的最大值为 ck,小 L 希望所选择的方案序列的 ck 在所有方案序列中是最小的。
事实上,可能有多个方案序列的 ck 达到并列最小值。由于小 L 喜爱编程,他患上了一定的强迫症(虽然他自己认为他的强迫症让他炫的发黄),他希望给他的序列是这多个方案中字典序最小的。
Tips:比较两个序列字典序即比较第一个不相同数字的大小,如 (1,2,3,4)<(1,2,4,3)。
输入格式
第一行为两个空格隔开的正整数 n,m,表示旅行的城市数与旅行所花的月数。
接下来 n 行,其中第 i 行包含两个空格隔开的整数 Ai 和 Bi,Ai 表示他第 i 个去的城市编号,Bi 为 0 或 1。如果 Bi=0 则表示城市 Ai 没有小 L 想去的景点,如果 Bi=1 则表示城市 Ai 有小 L 想去的景点,Ai 两两不同且有 1≤Ai≤N,即 {Ai} 为 1,2,…,N 的一个排列。
输出格式
输出仅包含一行,包含 m 个空格隔开的正整数 X1,X2,…,Xm,即给小 L 安排的旅行计划对应的路线。
输入输出样例
输入#1
8 3 2 0 3 1 4 1 1 0 5 0 6 1 7 1 8 0
输出#1
1 6 8
说明/提示
第 1 个月得到 2 点快乐值与 2 点疲劳值,第 2 个月得到 1 点快乐值与 1 点疲劳值,第 3 个月得到 1 点快乐值与 1 点疲劳值。3 个月中疲劳值与快乐值差的最大值为 0,达到所有方案最小值。
可行方案有:
- 1 6 8
- 3 6 8
- 3 1 8
其中 1 6 8 字典序最小。
N≤5×105,M≤2×105。