好多题都不会啊,这可咋整
先写着吧....大概会割掉....
求带点权树上的简单路径构成的点权序列的最长上升子序列的长度的最大值
一个比较容易想到的做法就是dp,设f[x,i]表示以x为根的子树中,以i为结尾的最长上升子序列的长度,g[x,i]就是下降。这里我们规定只能选取深度递降的顺序
那么每次合并子树就好了,这样直接做是n^2logn的。还可以用线段树记录这个结尾的状态,那么两个dp状态合并就是线段树合并了,这样就少一个n
给一棵树要求删掉一个节点,使得剩余每棵树中的cf490的答案最大值最小
这个做法就很强。首先可以找原树的最长路径所在的链c,那么要删的点一定在这条链上(否则最大值不变)
不妨假设删掉了一个点x,那么这条最长链被分成两部分c1和c2,此时再按照cf490的方法求一次最长链得到c',则分类讨论
于是就可以发现如果我们不断这么做下去,最终将得到若干条链的交,且这个交在不同层次的最长链上,删掉交里的点一定是最优秀的
每次对当前的交二分(取中点),判断新的交在哪一侧,这样就只是再多了一个log
定义函数\(f_h(x)=x\text{ mod } h\),求最小的\(h\)使得\(f_h\)是给定有限正整数集的perfect hash
不是perfect当且仅当存在\(a\neq b\),却\(f(a)=f(b)\),即 \(a_i-a_j\equiv 0\pmod h\),其中\(i\neq j\)
也就是说如果我们能算出任意两对数的差值,就可以方便地枚举答案了
直接开两个桶bct[i]和bct[INF-i],做卷积就好了....