8.2 day10图论+dp

100+70+70+20=260

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

T1

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

T2

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

设计dpi,j为跳到(i,j)所需最小花费

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

dpi,j=min(dpi,j)+|ii|+|jj|

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

dpi,j=min(dpi,jij)+i+j

发现可拆,直接分层扫描x轴维护上述柿子即可

正着扫一遍处理第3,4象限

反着扫一遍处理第1,2象限

时间复杂度:O(n2logn)

T3

考场写出来了树上莫队,但是维护丑了,用了bitset,复杂度多一个nw,没有这部分的部分分,沦为暴力70分

树上莫队不用说,维护询问,主要的是如何维护curans,我们插入一个数,最多3个质因数,我们可以想到一个简单的容斥去计算curans的增量:加上与自己没有重叠质因数的数,减去与自己至少有一个质因数重叠的数,加上至少与自己有两个质因数重叠的数......

依此,我们去枚举x的质因数的组合,并开一个桶记录全局质因数组合的个数,就可以做到上述效果,就不用bitset了

时间复杂度:O(qn)

T4

对于树上相邻的两个点,他们的M值的绝对值差1,不然不是合法情况,没有合法解,感性理解一下:从i走向相邻点j时,总是只会拉开u1,u2,u3大小为1的距离

为了准确定位3个点中点,我们将每两个点之间再插入一个点,此时原本M值翻倍,此时假设我们插入的点为x,相邻点为u和v,我们要去计算Mx,相邻点只会有两种情况:

1.|MiMj|=0Mi=Mj

此时说明x是uiuj的中点(ij)

由于我们开篇讲到的性质,MxMi要相差1,考虑枚举 Mx=Mi±1

由于这样的点只会有最多3个(u之间两两有一个),所以是23(常数)

2.|MiMj|=2

此时Mx就是|MiMj|2

讨论完两种情况,代表着我们能在O(23)以内得知所有点的M值

如果我们将一条边按M值从大指向小定向,那么整体流动的方向则是三个点中点的方向,最后汇聚在3个点的中点,不妨,我们假设diui到中点u的距离,因为无序,同时假设d1d2d3

观察得知,这里也可以分两种情况讨论:

1.d1=d2d3

img

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

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

d3d1=d2=Mu

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

2.d1<d2d3

img

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

考虑求方案

我们已经得知两个汇点的位置,所以他们之间距离已知,假设为 dist

此时 u1 距离 M1 的距离为 M1 ,距离 M2 的距离为 M2 ,我们会发现,这两个限制把 u1 的范围死死限制住了,不会使他跑到 u3 或者 u2 子树去,再看 u2 ,到 M1 距离为 M1 ,到 M2 距离为 dist+M1 ,也把 u2 限制住了, u3 则同理

统计也非常简单,以 M1M2 分别为中心dfs标记距离

这样我们就在 O(n) 的时间内解决了题目

posted @   Linnyx  阅读(21)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示