Loading

题解-冲刺[24,28],模拟83

冲刺24 翻转游戏

image

\[\huge N\leq 1e6 \]

考场上执着与搞回文串,一直思路都是错的。

但是换一个思路,直接考虑什么时候会重复计数,存在两个相同字母就会有一个分界点使得两对相同。

所以直接开通记录每个字母出现多少次,减掉重复的就行了。

冲刺25 铺地毯

image

\[\huge N\leq 1e6 \]

考场上写了nt扫描线,错失ak。

其实就是要求 \(n-1\) 个矩形的交,暴力做可以枚举这 \(n-1\) 个。
不暴力的话就搞出来前缀交和后缀交,枚举那一个,然后前后缀交一下,最后把合法的并起来。

注意每次都会计算一次 \(n\) 个矩形交的部分,每次都减掉最后加上即可。

冲刺26 货币系统

image

\[\huge T\leq 1e4,a,b,c,d,x\leq1e18 \]

考场上搞了一个麻烦做法,调了四个小时没有成功。

正解直接二分一个把小于 mid 的都换掉是否可行,可行在计算能换多少个,注意边界的特判。

冲刺27 超级加倍

image

\[\huge N\leq 1e6 \]

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 欢乐豆

image

\[\huge N\leq 2e5,M\leq3000 \]

发现只有 \(2m\) 个点的答案不是初始值,考虑把他们单独搞出来做最短路。

把每条修改的边看成无向边,原图会被划分成若干个连通块。

假设现在在一个连通块内有一个点 \(x\) , 那么他到其他连通块的所有点的答案都是 \(dis(x,z)+a_z\) , \(z\) 是和 \(x\) 同一个连通块的点。

在同一个连通块内,距离就是带着连通块外面 \(a\) 最小的点跑一遍,出来的最小 \(dis\)

现在问题变成了求出每个连通块内的全源最短路, \(N\leq 6000,M\leq N^2\)

直接 \(dij,foy\) 肯定都不行,考虑特殊性质:绝大部分边权是相等的。

直接用线段树优化一下dij的过程,每次取出最大的点,把所有出边排序,单点特殊修改,区间相同修改即可。

冲刺28 糖

image

\[\huge N,C\leq 5e6 \]

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,没想到由不重复切入就可以容斥解决,如果条件可以转化成式子,写下来题目的式子仔细玩一玩,没准会有奇效。

概括一下,问题主要有:

  1. 认为之前有题做不了,这题不能做。 :以后不能打标签。
  2. 搞一半假了,心态爆炸。:永恒的问题,说多无益。
  3. 不好好思考,水题不会。:永恒的问题,如何把每题都当成T1一样静心思考。
  4. 打出正解大意,细节爆炸。 :这个要改,打完立马测试极限数据,不要管题水不水
  5. 对一个思路钻牛角尖,浪费大量时间,还做不出来。 :永恒的问题,回头是岸。

希望退役之前能打一场没有遗憾的比赛,这样退役也没有遗憾了。

posted @ 2021-11-12 19:10  Soresen  阅读(66)  评论(1)    收藏  举报