T1
有 n个正整数 a[i],设它们乘积为 p,你可以给 p乘上一个正整数 q,使 p*q刚好为正
整数m的阶乘,求m的最小值。
分析:
题目要求一个最小的m使m!包含 p这个因子。
可以把p分解质因数,假设 p=∏ai^bi(ai为质数),那么只要 m!包含了每个ai^bi,m!就包含p。
所以对于每个ai^bi,分别求出满足条件的最小的 m,取最大值即可。
关于m使用所有数的分解出来的质因数个数来判断,二分即可。
T2
给出一个长度为 m 的上升序列 A(1 ≤ A[i]≤ n), 请你求出有多少种 1...n 的排列, 满足
A 是它的一个 LIS.
数据范围特别小,考虑搜索,无法剪枝。考虑状态压缩。
最长不降子序列的一种求法是:使用附加数组D[i],表示当前长度为 i的最长不降子序列最小的结尾是
多少,显然它是单调递增的。每插入一个数就二分找到第一个大于它的位置替换。
我们可以设状态S1,第i位为 1表示它在D 中出现了,出现的位置就是1~i位1 的数量
现在就可以设递推状态f(S,S1)表示当前用了S中的数,D的状态为S1的方案数
转移很容易转移,枚举这一位选什么直接更新
注意到S1一定是S的子集,于是可以用三进制表示。
T3
豪哥生活在一个 n 个点的树形城市里面,每一天都要走来走去。虽然走的是比较的
多,但是豪哥在这个城市里面的朋友并不是很多。
当某一天,猴哥给他展现了一下大佬风范之后,豪哥决定要获得一些交往机会来提升交
往能力。豪哥现在已经物色上了一条友,打算和它(豪哥并不让吃瓜群众知道性别)交
往。豪哥现在 spy 了一下这个人的所有行程起点和终点,豪哥打算从终点开始走到起点与
其相遇。但是豪哥是想找话题的,他想知道以前有多少次行程和此次行程是有交集的,这
样豪哥就可以搭上话了。这个路径与之前路径的有交集数量作为豪哥此次的交往机会。
但是豪哥急着要做交往准备,所以算什么交往机会的小事情就交给你了。
分析:
首先使用树链剖分,但被卡常了。有一种方法:
让我们来看看树上路径交可以怎么表示。画几棵树后可以发现:
令lca(a,b)=g,lca(c,d)=d。若树上路径[a,b],[c,d]有交集,则g在cd上 或 d在ab上。 令lca(a,b)=g,lca(c,d)=d。
若树上路径[a,b],[c,d]有交集,则 g在cd上 或 d在ab 上。
这个结论并不是那么好发现,可以粗略的感性理解一下:
假设我们现在手上是一条 lca 深度大的路径,这条路径最高可达点就是 lca,若 lca 不在另一条路径上,
又因为他lca深度大,所以不可能在另外一条路径 lca上方,所以就没有可达点了。
所以我们使用dfs序
静态树考虑dfs序。 (动态树考虑欧拉序)
对于一个点x,a->lca(a,b)这样的树链如果经过他,则一定是从它的子树走向它的祖先。
然后就比较显然了,每多加一个这样的x,则给他子树中所有点的权值都+1.
查询(a,lca(a,b),b)的时候,就用 a权+b权-lca权*2.
若 a与lca在x的上下两方,则会被累加到贡献。
同样地考虑dfs序,
很方便的树上前缀和。若有一条路径(a,b),则给lca(a,b) +1,a-1,b-1.然后查询一个点到根的权值和,这
是离线时的套路。
但这题这样不好做,因为不能每一次都重构树,于是我们变一下,变成类似树上后缀和的东西。
对于一条路径(a,b),给a+1,b+1,lca-2. 一个点的子树权值和就是他的权值。
用两树状数组维护一下dfs 序上的信息,我们就把这道题给搞定了。
这题的坑点主要在于,两个树状数组维护的信息意义是不一样的,压根不可以相提并论。
总结:
写代码一定要分段。利用特殊数据来骗分。