8.2 day10图论+dp
100+70+70+20=260
感觉如果时间够感觉还能写一下,结果T3超大数据结构写死了
T1
观察到最短路径仍然最优,直接dij即可,注意判断终点不用等红灯
T2
暴力是\(O(n^4)\)的,是dp,但是我写的是分层图,同样时间,还没有优化空间,寄
设计\(dp_{i,j}\)为跳到\((i,j)\)所需最小花费
每次从所有点转移,算曼哈顿距离
假如从左上角转移,柿子就可以写成
发现可拆,直接分层扫描x轴维护上述柿子即可
正着扫一遍处理第3,4象限
反着扫一遍处理第1,2象限
时间复杂度:\(O(n^2\log n)\)
T3
考场写出来了树上莫队,但是维护丑了,用了bitset,复杂度多一个\(\frac{n}{w}\),没有这部分的部分分,沦为暴力70分
树上莫队不用说,维护询问,主要的是如何维护curans,我们插入一个数,最多3个质因数,我们可以想到一个简单的容斥去计算curans的增量:加上与自己没有重叠质因数的数,减去与自己至少有一个质因数重叠的数,加上至少与自己有两个质因数重叠的数......
依此,我们去枚举x的质因数的组合,并开一个桶记录全局质因数组合的个数,就可以做到上述效果,就不用bitset了
时间复杂度:\(O(q \sqrt n)\)
T4
对于树上相邻的两个点,他们的M值的绝对值差\(\le 1\),不然不是合法情况,没有合法解,感性理解一下:从\(i\)走向相邻点\(j\)时,总是只会拉开u1,u2,u3大小为1的距离
为了准确定位3个点中点,我们将每两个点之间再插入一个点,此时原本M值翻倍,此时假设我们插入的点为x,相邻点为u和v,我们要去计算\(M_x\),相邻点只会有两种情况:
1.\(|M_i-M_j|=0\rightarrow M_i=M_j\)
此时说明x是\(u_i\)和\(u_j\)的中点\((i\neq j)\)
由于我们开篇讲到的性质,\(M_x\)与\(M_i\)要相差1,考虑枚举 \(M_x=M_i\pm 1\)
由于这样的点只会有最多3个(u之间两两有一个),所以是\(2^3\)(常数)
2.\(|M_i-M_j|=2\)
此时\(M_x\)就是\(\frac{|M_i-M_j|}{2}\)
讨论完两种情况,代表着我们能在\(O(2^3)\)以内得知所有点的M值
如果我们将一条边按M值从大指向小定向,那么整体流动的方向则是三个点中点的方向,最后汇聚在3个点的中点,不妨,我们假设\(d_i\)为\(u_i\)到中点\(u\)的距离,因为无序,同时假设\(d_1\le d_2\le d_3\)
观察得知,这里也可以分两种情况讨论:
1.\(d_1=d_2\le d_3\)
此时1,3中点同时也是2,3中点,那么可能有一个疑问,为什么3个点的中点不是图中蓝色的位置呢,考虑我们求得是中位数,在蓝色位置时,到三个点dis相同是 (d,d,d),但是我们向着1,2走一步,就成了(d-1,d-1,d+1),中位数实际上减小
我们如何去求方案数呢,我们知道此时
三个点分别在以u为根不同子树内,首先dep不足d1的先排除,设计\(dp_{i,0/1/2,0/1}\)表示此时处理到第i棵子树,分配了0/1/2个u1,u2,0/1个u3,线性时间内可求
2.$d1<d2\le d3 $
此时看上去比较复杂,但是如果按照上文的方法分析,很快就能定向出来
考虑求方案
我们已经得知两个汇点的位置,所以他们之间距离已知,假设为 \(dist\)
此时 \(u_1\) 距离 \(M_1\) 的距离为 \(M_1\) ,距离 \(M_2\) 的距离为 \(M_2\) ,我们会发现,这两个限制把 \(u_1\) 的范围死死限制住了,不会使他跑到 \(u_3\) 或者 \(u_2\) 子树去,再看 \(u_2\) ,到 \(M_1\) 距离为 \(M-1\) ,到 \(M_2\) 距离为 \(dist+M_1\) ,也把 \(u_2\) 限制住了, \(u_3\) 则同理
统计也非常简单,以 \(M_1\) ,\(M_2\) 分别为中心dfs标记距离
这样我们就在 \(O(n)\) 的时间内解决了题目