一些神奇的东西

一、对一棵树求一个排列, 满足排列的每相邻两个数在这棵树上对应的节点距离不超过3,所有边权均为1

其实yy一会儿可能会有一些想法,但是难写啊!

有一种非常神奇的写法,描述一下是这个样子的

对深度为奇数的点先序遍历,对深度为偶数的点后序遍历

也许正确性没那么显然,但是我们手玩手玩就发现是对的了

大概这么写就行了

void dfs(int now,int typ)
{
        if(typ) s[++tot]=now;
        for(int i=head[now];i;i=Next[i])
            if(to[v]!=f[now])
                dfs(v,typ^1);
        if(typ^1) s[++tot]=now;
}

二、一个长为\(n\)的01串有多少种不同的子序列?一个长为\(n\)的字符集大小为\(S\)的串有多少种不同的子序列?

一般的,我们可以在\(O(2^SN)\)的时间内解决这个问题

具体做法可以先看看这个具体问题 喵QAQ

UPDATA:求本质不同的子序列有更优秀的做法,甚至可以区间查询

咕咕咕

posted @ 2018-08-15 16:53  露迭月  阅读(351)  评论(0编辑  收藏  举报