2022杭电多校4题解报告(同步自语雀)

一、赛后总结

嘤嘤嘤,本人纯萌新,深夜反思自己到底有多菜~(;′⌒`)

前天没写出状压,再前面不会SAM和圆方树,再往前不会NTT和FFT,真的是个啥也不会的萌新呢。

这场主要的问题在于02的0环和11的线性基。

02基本思路比较清晰,topsort+dijkstra,而且考场中考虑了0边的问题,边权在处理中乘1e5并添加topsort的0边点权作为dijkstra排序依据,这里topsort的点权用以保证0边的起始点在与终止点距离(到1点)相等时优先枚举起始点。本以为0环在保证答案Phi有穷时不会对结果产生影响(毕竟非纯0环不在答案路径即1->n路径上),但为什么没考虑到纯0环(sum_e=0,sum_p=0)呢?萌新属实考虑不周全啦,没有考虑到这个对答案的影响呢!这个纯0环的存在可能会导致通过0环的一些点没有被topsort枚举。所以呢?通过萌新学过的tarjan算法提前缩一下0边环点就好辣~整体思路顺序:tarjan->topsort->dijkstra。

11的线性基萌新不会辣!幸好中途看了一小时就放弃啦,萌新怎么会学过线性基呢?事实上萌新连构造最大异或和的形式都没有成功呢!呜呜呜这一个小时一直在想存在x不等于y使a_x=a_y怎么用,也没有想通。赛后队友还在说可以取l=r使a_l=a_l^a_l=0。呜呜呜这不是看错题了,这是在造萌新不敢想的题叭。。。不过确实有一些过于依赖a_x=a_y性质导致想偏了方向,应该先手玩构造形式的说呢。不过构造出来也不会线性基辣,所以萌新真的好菜呢!(半夜学了一下,是一个有趣的算法呢!萌新愉悦o(* ̄▽ ̄*)ブ

02和11是好题呢,恰好体现了萌新的本质,把萌新与大佬们区分开来!真棒!

考场上萌新写出了01和07,都是出题人良心送给萌新的简单题!出题人真的。。。我哭哭

04和06两个签到是队友做的

UPD1: 补了03的差分约束,啊啊啊是真的板啊,萌新看呆了,感觉只要会差分约束就可以做出来呜呜呜~

UDP2: 补了05的不删除栈黑科技,确实妙,感觉本质是提前计算,但每个位置至多在左右计算两遍的算法性质很精妙~

(by Star_Dream)

二、题解报告

1001 Link with Bracket Sequence II

嘤嘤嘤,有点(~ ̄(OO) ̄)ブ的区间DP,dp[i][j]表示[i,j]的合法匹配数,转移枚举与i匹配的位置mid,i<mid<=j,转移式为dp[i][j]=sum{dp[i+1][mid-1]*dp[mid][j]*(匹配数)},记得边界特殊处理和取模就好啦。

题目特别友好,萌新也能做!

1002 Link with Running

嘤嘤嘤,有点/(ㄒoㄒ)/~~的图论题。思路:tarjan+topsort+dijkstra.

  1. Tarjan:根据0边对0环进行缩点
  2. Topsort:根据0边对点进行拓扑排序,顺序记为点权。
  3. Dijkstra:传统的最短路算法,将排序依据改为(边权*1e5+点权),这样做可以保证同边权0边起始点优先。

呜呜呜,没考虑纯0环对拓扑的影响,萌新好笨啊!

1003 Magic

差分约束,萌新又不会辣!

补辣补辣!之前确实没有正经学过差分约束,学了以后这题就是板子题辣~

注意的是这个题里有ingredients和value两种说法,所以需要注意的是求前面p约束的是value而后面LR约束的是ingredients,所以这里把value通过ingredients约束就可以辣~三个约束条件如下:

  1. sum[min(n,i+k-1)]-sum[max(0,i-k)]>=pi
  2. sum[R]-sum[L-1]<=B
  3. sum[i]-sum[i-1]>=0

最后如果有解sum[n]-sum[0]就是答案辣~

还是谈一下学差分约束的想法:差分约束好像是oi时期挺偏的知识点(雾)。。。但是学一下发现就是转化为图论知识点,约束Ci-Cj<=A相当于Ci<=Cj+A,这样就是j到i连一条边长为A的边,跑最短路就能符合条件辣~这里显然会有负边(不然全0就符合约束辣),所以不能跑dijk哦。关于SPFA,它死了。所以不如直接跑简单好写的bellman-ford算法呢~

1004 Link with Equilateral Triangle

签到到,萌新不想做辣!

1005 Link with Level Editor II

矩阵雾,萌新的线代忘干净辣!

补辣补辣~好像这是我上大学后第一次正儿八经用矩阵知识解题(雾

具体操作比较简单,m*m转移矩阵存储转移状态,也就是a[i][j]存当前区间对应世界从i到j的方案数。可以将状态视为1*m的矩阵即到每个Node的方案数。显然最初状态矩阵只有1有1个方案(起始点),其余Node方案为0。所以对应矩乘结果的(状态*a)[1][m]表示获胜方案数。这个就是合法与否的条件辣~

要求是连续区间,所以顺序向后枚举右边界就可以辣~不合法时右移左边界,但由于矩阵不一定可逆,移动左边界这一相当于删除的操作不可进行。所以规避操作,用不删除栈黑科技即可解决~

不删除栈黑科技:区间为l,r,另有参数mid,[l,mid]以后缀形式存储(即本题的变换矩阵矩乘后缀),(mid,r]统一存储到一个矩阵之中,所以总的变换矩阵为(后缀矩阵[l,mid]*统一矩阵(mid,r])。l<mid时正常右移左边界,但l=mid时右移左边界操作为l=r+1,mid=r,这时再左移左边界l重新计算后缀矩阵。这样左移左边界l会保持l>lastmid(因为之前右移l的原因是mid不合法辣~),所以每个点对应转移矩阵只会参与矩乘2次。所以这个方法的移动操作是O(n)的,再加上内部操作,总复杂度就是O(n*内操作复杂度)。如这题的矩乘,总复杂度为O(nm^3)。

最后还是谈一下学这个黑科技的感想:确实很有趣的一个知识点,有效的避免了删除操作可能带来的麻烦甚至是不可执行。内部思想关键是后缀提前计算删除的结果,但分左右两边的操作又保证了内部每个点至多参与2次运算,所以是O(N)的移动指针,很巧妙~

1006 BIT Subway

签到到,萌新不想做辣!

1007 Climb Stairs

嘤嘤嘤,贪心题!萌新发现有下面几个性质:

  1. 能+1就不跳
  2. 跳一次+2的如果不回跳,跳过的就永远ByeBye辣
  3. 能跳到(i)就不跳到(i+1),即找第一个能跳的

是萌新也能做的简单题呢(๑•̀ㅂ•́)و✧

1011 Link is as bear

线性基,萌新深夜加班刚刚学废辣o(* ̄▽ ̄*)ブ

其实发现在有x!=y且a_x=a_y的条件下,必然有两个相邻的元素要么同时取,要么不同时取(换句话说,如果原来是间隔取数组元素,那么对于x和y,如果要异或a_x,那么不要异或a_x改为异或a_y;如果不要异或a_x,根据间隔情况选择同时不要异或a_y或者异或a_x和a_y)。

好辣!既然有两个相邻的元素同时取或不取,操作一下就发现可以为所欲为辣。因为同时取除非全取,在非全取时可以构造出两个连续不取的位置,两个连续不取就可以任意取与不取元素辣。所以,最后转化的题意是任意取元素使其异或和最大!

这时候就可拿出萌新刚学的线性基辣!板子一套,做完辣!

最后谈一下萌新学线性基的感悟:感觉这个算法有点类似于做一套向量的基底,这里就相当于是原数列的异或基底,它满足基底的基本性质,即最小和可表示所有原数列元素。求最大异或和也非常方便,基于二进制性质,从大到小枚举线性基每一位,当前答案缺则添不缺则continue就好辣。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hiroxzwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值