Test 2022.09.26

今天是水题专场

T1 扩散

感觉这种要么就是二分答案网络流,要么就是最小生成树,(随便口胡的),树德保留节目了属于是。

分析

简简单单一眼最小生成树(又是),边权就是两个点之间存在公共区域的时间,这个距离随便找一找规律就好算了。这里直接给结论了w(x1,y1,x2,y2)= abs(x1x2)+abs(y1y2)2然后建所有可能的边,最后再最小生成树就行,(听说二分也能做?

Code

点击查看代码

T2 树链剖分板子

没有什么好说的,就浅浅地总结一下

dfs1:求出基本信息:深度、父亲、子树大小、重儿子编号
dfs2:求出dfn序、对应节点的权值、当前节点的重链顶端节点
query:求出从lr的路径上面的信息
实现方法就是只要当前两个节点的顶端节点不同,就让顶端节点深度更深的点跳到它所在重链的顶端,并且统计这一条链的答案,直到lr在一条重链上面。最后再把深度深的点跳到浅的点上,再统计这一小节的答案。
画个图就很轻易地知道这时候每个子树的dfn序是一定连续的,所以就可以用线段树来维护区间最值

Code

点击查看代码

T3佳佳的数学作业

一眼矩阵,可是一开始遇到了一些困难,比如转移矩阵里面必须是常值,但是后面经过一系列推导和转化,还是把感觉很妙的一个解给写出来了,马上就要去跑步了,推导的过程明早重点来写,先贴代码吧

Upd2022.09.27:增加了昨天说的心路历程内容

Part1

一开始肯定想到的是直接递推对吧,有递推公式Tn=Tn1+n×Fn,写出来的矩阵暂且认为是

[1n0011010][Tn1FnFn1]:[TnFn+1Fn]

你会发现一定会有一个变量n使得矩阵每次都不同,无法使用快速幂,所以要换思路

Part2

考虑到Tn=F1+2F2+3F3+...+nFnFi的系数是阶梯状的,我们可以考虑每次加上Sn,再减去前面相应的部分,最后就可以经过n次递推得到Tn,我们定义一个Kn=Tn,K1=F1+...+FnK2=F1+2F2+2F3+...+2Fn,F3=F1+2F2+3F3+3F4+...+3Fn,可以看出来我们每一次递推都可以固定一位的系数,且容易得到递推公式:Ki=Ki1+SnSi1.
以下就省略一些了,最后的转移矩阵推出来就是:

[1110001000001100001100010]

这样就全部都是常数了

Code

点击查看代码

T4中位数

说实话一开始真的没什么思路的,但是想到了对于当前这个位置统计它前后大于和小于它的是否相等,但实在没有想到用+11的方式来表示,还可以用查分的方式来维护区间和

Code

点击查看代码

本来以为今天会很早就改完,没想到被树剖卡死了,害得多练啊

posted @   Hanggoash  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示