DTOJ 4724. 欧拉路径树

☆樱花仙子☆ 提交于 2020-02-21 19:33:50

题意

ETT 的一种解释:对大小为 nn 的树进行 dfs,记录每一步到达的点,生成长为 2n12n-1 的序列,称为该树的 ETT.

例如,n=7n=7 的满二叉树的一个 ETT 为 1,2,4,2,5,2,1,3,6,3,7,3,11,2,4,2,5,2,1,3,6,3,7,3,1.

设有大小为 nn、以 11 为根 的树,现给出其 ETT 的一部分,请还原原 ETT。

#1(20pts): T=10,n5T=10,n\le 5.

#2(30pts): T=10,n103T=10,n\le 10^3.

#3(50pts): n5×105\sum{n}\le 5\times 10^5.

保证有解。

题解

发现两个给定的相同的数xx之间的数一定是xx的一个子树的欧拉序,考虑把每两个相同的数之间的欧拉序先确定,注意到这中间不会有给定的相同的数(如果有就会先处理掉),做完后把这个区间缩成xx,最后就变成一个没有给定重复的数的序列,和刚才的问题是一样的。
考虑如何把一个头尾确定,中间给定的数没有重复的数的确定。因为是欧拉序,考虑从前往后扫,维护一个栈代表从根到当前节点的路径,遇到一个给定的数,直接模拟;遇到,有三种选择:填一个和栈的倒数第二个相同的数,填一个新的数,或填一个与后面某个数相同的数。我们的原则应是尽量不新增数,且保证尽量多位置合法(其实两者是共通的)。设后面一个给定数的位置为jj,当(sjsi1)2=ji(s_j-s_i-1)*2=j-iss为给定数的个数的前缀和)时,如果ii填了aja_j,那么中间的?填恰好可以用中间的数填完。这样做可以保证后面一段是合法的,同时不会影响到前面,所以应先考虑这种做法(如果先考虑前面,就可能使后面不合法)。如果不是这样的jj,或者会新增数或者不能填,都无需考虑。用vectorvector维护一下siis_i-i相同的下标(不要用stack,会MLE),如果有的话取最小的,否则考虑弹栈,再不行就新增一个数。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!