【考试总结】2022-06-04

1n 中的偶数向半数自身连边,那么行程若干条链,每个 1 都需要使用上面行程的链或者链的一部分来进行填充

注意到链的长度和数量都非常有限,考虑使用高维 DP 来解决这个问题,设 fi,c1,c2,c3,c4,c5,c6,lim1,lim2 表示长度为 i 的链有 ci 条,不能填的元素所在的链的长度分别为 lim1,lim2

转移考虑枚举断开的链的长度以及断开的是长度链的哪个部分,注意链可以正反填入,对应的不合法元素也不一样,注意长度为 1 的链被选中后 可能会造成两个元素不合法,这也就是为啥要开到九维

存储状态时将中间六个压缩起来,用类似哈希表的方式

预处理 fc,a,b 表示从第 c 列的第 a 行走到第 b 行最少需要覆盖多少石子,|ab|=1 时答案固定,否则需要正向反向做两遍 DP

分治计算跨过区间中点 mid 的答案,注意到起止点分处于中线两边时只会跨过一次中线,否则因为列数过于有限导致路线不优

仍然使用一个 DP 来计算中 (1/2/3,mid)(1/2/3,[l,mid]) 的最短路以及 (1/2/3,mid+1)(1/2/3,[mid+1,r]) 的最短路,转移即枚举从上一列的哪行进入这列,需要使用上面说的 f

枚举起止点在哪行跨过了中线,最优决策下需要有该行 l 满足 dis(A,(l,mid))+dis((l,mid+1),B)dis(A,(l,1/2/3))+dis((1/2/3,mid+1),B)

问题变成了二维偏序,在行标号小于钦定的最优决策行时将某一维权值减一来避免重复统计相等的情况即可

将网格图变成 Θ(n+m) 个横向 & 纵向的线段,其中在横向转弯进入某横向线段后非转弯点的最短距离都相等

所以求出来到达每个横向线段最少需要多少次转向,到达纵向线段最少需要多少次转向再统计答案

前者可以使用可持久化线段树进行优化建图,即按行扫描,将每列的对应的线段标号放到主席树的叶子上,对于当前行的线段去可持久化线段树上做区间连边

连向真实线段的边带有 1 的权值,辅助边权值为 0

然后进行 01BFS 即可得到源点到每个线段的最小转弯放置数量

之后扫描所有列,并使用线段树维护所有行在上文中求出来的结果,尝试使用列上的线段信息将交点的信息更新正确

容易发现存在交点的两条线段最短路至多差 1 那么维护最小值以及个数就能得到正确答案

posted @   没学完四大礼包不改名  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示