题解-冲刺[24,28],模拟83
冲刺24 翻转游戏

考场上执着与搞回文串,一直思路都是错的。
但是换一个思路,直接考虑什么时候会重复计数,存在两个相同字母就会有一个分界点使得两对相同。
所以直接开通记录每个字母出现多少次,减掉重复的就行了。
冲刺25 铺地毯

考场上写了nt扫描线,错失ak。
其实就是要求 \(n-1\) 个矩形的交,暴力做可以枚举这 \(n-1\) 个。
不暴力的话就搞出来前缀交和后缀交,枚举那一个,然后前后缀交一下,最后把合法的并起来。
注意每次都会计算一次 \(n\) 个矩形交的部分,每次都减掉最后加上即可。
冲刺26 货币系统

考场上搞了一个麻烦做法,调了四个小时没有成功。
正解直接二分一个把小于 mid 的都换掉是否可行,可行在计算能换多少个,注意边界的特判。
冲刺27 超级加倍

Nb题,构造偏序关系简化题意。
首先考虑在序列上的做法,你当然可以无脑线段树维护单调栈,但有点大炮打苍蝇了。
设 \(L_x\) 代表 \(x\) 左边第一个大于 \(x\) 的数, \(R_x\) 代表 \(x\) 右边第一个小于 \(x\) 的数。
一对 \(x,y\) 合法,仅当 \(x < y\text{并且} L_y<x \text{并且} R_x>y\) 。
直接朴素三维偏序是 \(nlog^2n\) 的,但是由于本题的特殊性,若 \(x>y\) ,则 剩下两个偏序必定满足。
所以可以不考虑第一维偏序, 直接做剩下两维偏序,最后减去 \(n*(n-1)/2\) 即可,复杂度 \(nlogn\) 。
还有一种做法。
可以构造一颗小根堆笛卡尔树,一颗大根堆笛卡尔树,合法就是 小根堆上 \(x\) 是 \(y\) 的祖先,大根堆上 \(y\) 是 \(x\) 祖先,直接用 \(dfs\) 序判断即可。
kul重构树是树\图上的笛卡尔树,树上两点间路径的最大\小值就是他们的lca
所以建出来 \(kul\) 重构树之后,dfs序做偏序就行了,对点建kul重构树,直接按点权排序,从大扫小的边,考场上需要用自己胡吧。
模拟83 排列
三维偏序, \(-1\) 的处理还是很简单的,考场上想了一半假了,考后就修好了。
先考虑 cdq 的时候处理 -1 的问题,可以先算出来不带-1的偏序对数,再算出来-1,数之间的和数,-1之间的。
-1,-1 之间的直接用期望计算 ( \(n*(n-1)/4\) ) 。
考虑优化三维偏序,由于是排列,所以无重复, \(i>j,i<j\) 必定有一个成立。
对于一个数对 \((i,j)\) , \(i<j,b_i<b_j,c_i<c_j\) 必定有 二/三 个成立。
对于每两维都统计起来加起来,假设是 \(K\) , 答案就是 \((K-(n*(n-1)/2))/2\) ,因为每个成立两个的都会被统计一遍,成立三个的被统计三遍,都减去一遍后,只有成立三个被统计两遍,除二就是答案。
没有重复数的三维偏序可以一个log容斥做
冲刺27 欢乐豆

发现只有 \(2m\) 个点的答案不是初始值,考虑把他们单独搞出来做最短路。
把每条修改的边看成无向边,原图会被划分成若干个连通块。
假设现在在一个连通块内有一个点 \(x\) , 那么他到其他连通块的所有点的答案都是 \(dis(x,z)+a_z\) , \(z\) 是和 \(x\) 同一个连通块的点。
在同一个连通块内,距离就是带着连通块外面 \(a\) 最小的点跑一遍,出来的最小 \(dis\) 。
现在问题变成了求出每个连通块内的全源最短路, \(N\leq 6000,M\leq N^2\) 。
直接 \(dij,foy\) 肯定都不行,考虑特殊性质:绝大部分边权是相等的。
直接用线段树优化一下dij的过程,每次取出最大的点,把所有出边排序,单点特殊修改,区间相同修改即可。
冲刺28 糖

NB反悔贪心题,只会一个 \(NC\) 的 \(dp\) 。
首先这种东西只能 \(O(n)\) 的情况下,必须有一种策略(大佬说只要买卖问题都要有种策略;
然后拿出反悔贪心的精髓,当前把糖果补满,如果用不完最后再退掉。
用一个单调队列维护未确定状态的所有糖果(还在手里面,没有吃掉)
路上面,先吃买的时候花费最少的(因为到最后可以把花费都退回来,所以要留着花费大的)
到当前点,如果 \(buy_{that}\geq buy_{i}\) , 那就把他退掉,因为在当前买花更少的钱一定更优。
还有一个卖糖的操作,肯定是卖的价格大于买的价格才会有这个操作。
假设在 \(pos\) 买了一个 \(cost\) 的糖,当前在 \(i\) , 并且这个糖还处于未确定状态。
那么如果 \(max :sell_{[pos,i]} \geq buy_i\) , 那么可以在路上退掉这个糖,在当前买回来,不会影响状态。
单调队列可以直接维护前两种操作,对于第三种 rmq 操作,发现左右端点都单调,可以再开一个单调队列维护。
模拟83 追逐
这是一个nb题,考场上思考了1个多小时,1分没拿到。
首先可以把 \(t\) 放到根,这样, qjd 最后必须走这一条链。
还有一个事情就是 qjd 最多只能进入一个子树,一旦进入一个,妹子就可以封掉其他的。
还有可以通过树形 dp 计算 qjd 进入一个子树后可以浪费妹子多少操作。
具体转移就是设 \(f_i\) 代表 qjd 进入 \(i\) 子树最多浪费多少个操作,转移就是 \(f_x=nxtmax(f_y)+drgee_x\)
理解就是 qjd 进入次大的子树用 \(nxtmax(f_y)\) 次操作,然后封掉其他子树,解开次大子树用 \(drgee_x\) 次操作。
以上是比较显然的策略和 dp,本题的难点在于你不知道 qjd 会进入哪个子树 ,如果你执着于贪心构造一种方案,你会陷入无尽的泥潭 (考场上1个小时就这么过去了。
所以,考虑通过二分答案来得到答案 (或许二分答案是不知道最优策略是得到最优答案的一种套路)
二分一个 \(mid\) , 考虑从 \(s\) 往根跳的过程,并检查每一个不在链上的子树。
假设当前 qjd 向上走了 \(d\) 步,那么妹子有 \(d+1\) 次操作次数 , 预处理出来 \(other_x\) 代表 \(x\) 上面的链上的叉数 ,假设 \(must\) 代表妹子为了让次数保持在 \(mid\) 以内必须封掉的边数 。
如果出现一个子树 \(x\) , \(f_x+other_x+must>mid\) , 代表如果 qjd 进入这个子树,那么妹子就无法在 \(mid\) 次内完成操作,那么妹子就必须封掉这个子树 ,由于当前妹子有 \(d+1\) 次操作次数,但是 \(must>d+1\) ,那么就代表妹子无法在 \(mid\) 次内完成操作,否则 must ++ , 代表妹子封掉这个子树。
这个 \(check\) 本质是一个从下到上 qjd 和妹子同时贪心的过程,归纳法容易证明贪心的正确性。
总结
这几场除了一场全是NB题之外,都是有签到题的。
其中有一些题我做的并不满意,列举出来
24,翻转游戏:沉迷一个思路不放,最后签到失败:一个思路不成功,就应该适当放弃。
25,铺地毯:见到数据结构认为能卡过就打,没有思考复杂度更优的做法,最后调2h,本地4s才知道什么是绝望。
26,货币系统:调试不成功/实现细节过于之多,正解的概率很小,平复心态思考新方法才是明智之举。
27,开挂:快速幂挂掉50pts,能逆元就不要快速幂求逆元,一定不要因为做法简单掉以轻心,赛后本地测一个0.8s,当时认为水题一个极限数据都没有测,打完正解第一件事就是测试极限数据是否时间正确。
28,树上路径 :连按边分开求直径都没想,大家都切了就你没切,认为是点分治,就离不开这个思路,是一个严重的问题。
83,排列,想到60pts的暴力并不是很难,然而你的-1处理方式,做出来一半,剩下一半不会就认为假了,赛后才知道怎么做,假了心态不能慌,能补救就补救,不能补救要及时调整心态,关于容斥那部分,你认为三维偏序只能两个log,没想到由不重复切入就可以容斥解决,如果条件可以转化成式子,写下来题目的式子仔细玩一玩,没准会有奇效。
概括一下,问题主要有:
- 认为之前有题做不了,这题不能做。 :以后不能打标签。
- 搞一半假了,心态爆炸。:永恒的问题,说多无益。
- 不好好思考,水题不会。:永恒的问题,如何把每题都当成T1一样静心思考。
- 打出正解大意,细节爆炸。 :这个要改,打完立马测试极限数据,不要管题水不水
- 对一个思路钻牛角尖,浪费大量时间,还做不出来。 :永恒的问题,回头是岸。
希望退役之前能打一场没有遗憾的比赛,这样退役也没有遗憾了。

浙公网安备 33010602011771号