今天状态还不错,得分还可以:100+10+50。第二题题目没有加SPJ,虽然我打了正解,但还是A不了。
Problem1:100
这题注意到样例解释中有一句话:显然只有3的倍数才是好的。这句话看似没什么稀奇的,实则给我们重大的解题思路。好的数的分布毫无规律,为什么一定只有3的倍数才是好的?仔细想一想就可以发现所谓的“好的数”一定要是原序列A中所有数的最大公因数的倍数,因为设A1=kp1 A2=kp2 A3=kp3 ......,k为A中所有数的最大公因数。又因为“好的数”一定是A中的数通过不断地加减运算得到的,所以“好的数”必定是k的倍数。这样样例解释中的3指的就是最大公因数。
Problem2:10(or 100)
如果f[i]表示以i为根的子树中,包含了节点i的连通子图个数为多少,则满足f[i]=pai(f[i的儿子]+1),pai表示连乘。那么如果树的形态给出,我们就能求出f[1]。现在逆向思维,如果f[1]给出,我们怎么求树的形态。因为每个f[i]都是由他所有儿子的f值+1全部乘起来得到的,所以我们可以尝试将f[i]分解质因数,每个分解出的质因子就代表他的儿子,然后这个儿子的f值就为这个质因子-1。就这样,我们在分解质因数的同时构造这颗树,就能得到树的形态了。根据实测情况,这种方法应该是不会构造多于60个点的,至于为什么,我也不知道啦!
Problem3:50
这题主要是注意到一个细节:询问串串长之和<=2*10^5。这个条件说明询问串长的种类并不多,最多只有串长之和的算术平方根。所以我们只需要将询问按询问串串长从小到大排序,对于每一种串长,我们只需O(n)扫一遍,用一个桶记录一下就行了。
然而为什么我只拿了50分,因为我没有使用桶,而是又sb地使用快排。这个故事告诉我们,不要以为排序方法中快排一定在什么时候都是最快的。每一种排序方法都有它的优缺点,而在这种待排序序列数字都比较小的时候,桶排是占明显优势的。
总结:如果今天第二道题考我们逆向思维,第三道题考我们离线处理询问,那今天第一道题就考我们观察能力,是否能从题目中的每一个信息中挖掘出做题的一些思路。今天总体情况还好,明天继续保持。