8.2 day10图论+dp

100+70+70+20=260

感觉如果时间够感觉还能写一下,结果T3超大数据结构写死了

T1

观察到最短路径仍然最优,直接dij即可,注意判断终点不用等红灯

T2

暴力是\(O(n^4)\)的,是dp,但是我写的是分层图,同样时间,还没有优化空间,寄

设计\(dp_{i,j}\)为跳到\((i,j)\)所需最小花费

每次从所有点转移,算曼哈顿距离

\[dp_{i,j}=min(dp_{i',j'})+|i-i'|+|j-j'| \]

假如从左上角转移,柿子就可以写成

\[dp_{i,j}=min(dp_{i',j'}-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\)

img

此时1,3中点同时也是2,3中点,那么可能有一个疑问,为什么3个点的中点不是图中蓝色的位置呢,考虑我们求得是中位数,在蓝色位置时,到三个点dis相同是 (d,d,d),但是我们向着1,2走一步,就成了(d-1,d-1,d+1),中位数实际上减小

我们如何去求方案数呢,我们知道此时

\[d3\ge d1=d2=M_u \]

三个点分别在以u为根不同子树内,首先dep不足d1的先排除,设计\(dp_{i,0/1/2,0/1}\)表示此时处理到第i棵子树,分配了0/1/2个u1,u2,0/1个u3,线性时间内可求

2.$d1<d2\le d3 $

img

此时看上去比较复杂,但是如果按照上文的方法分析,很快就能定向出来

考虑求方案

我们已经得知两个汇点的位置,所以他们之间距离已知,假设为 \(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)\) 的时间内解决了题目

posted @ 2023-08-02 16:26  Linnyx  阅读(17)  评论(3编辑  收藏  举报