模拟赛下半
模拟赛下半
那一天她离我而去
板子,写写吧
发现一个暴力是断掉源点周围若干边之后跑最短路,发现只要让最小环上的两条边不同时被断开就好了,考虑到两个数不同,二进制必有一位不同,所以按照编号的二进制位分组就好了,复杂度 \(O(m\log m\log n)\)
考虑一个更优秀的做法,建出最短路树(其实就是断掉最短路dag里面的一些边),发现只要枚举非树边,如果这条边两边的结点lca就是源点,直接更新答案就好了,复杂度 \(O(m\log m)\)
单调区间
不会 \(O(n)\),写个 \(O(n\log n)\)
首先肯定是扫描线,对每个左端点算能扩展到的最大右端点
发现可以在值域中画出两条直线代表这两个序列,在它们交点之后才有可能扩展不到,再仔细观察一下:
只有 中小大中 中大小中 两种才可能满足这玩意
开个值域树状数组,一边扫一边维护最后一个大于/小于某个数出现位置的数就好了,发现就是前缀 \(\max\)
Kanon
水题,但是想写
发现每个雪球不可能超过前面的,所以直接思考如何确定中间的雪归谁
前缀和出来之后二分就完了
Summer Pockets
赛时想到了,结果没写上
考虑先放一个方向上的栅栏,发现分割成的区域里蝴蝶数量一定都是一样的,因为这些区域内部的最终连通块数量一定一样
所以我们可以直接把蝴蝶排序,枚举蝴蝶数量的约数,之后确定这一边的合法方案数,对于另一个方向,也是每个栅栏可以放置的区间满足两两不交,暴力做就好了
发现后面的暴力卡满是 \(O(n^2)\) 的,前面枚举约数是 \(O(\sqrt n)\) 的,所以复杂度大概是这个样子,加上这两边都根本跑不满,所以快得飞起
穗
ynoi 题
考虑单点怎么做,显然带修莫队和分块都能肆意水过,就是维护一个 pre
考虑我们实际上查询的是什么 \(pre<l\) 并且 \(l<pl<r\) 的数个数,这不是二维数点么,加上修改,就是三维数点
发现根据颜色段均摊原理,pre 数组和修改颜色块次数一样,是 \(O(m)\) 的
于是变成了三维偏序板子,CDQ就能做到 \(O(n\log^2n)\)
Non-breath oblige
又是 ynoi 题
先不带交换操作,
就是说对于一个询问,只有最近的一次影响到它的推平会有贡献,所以我们直接记录一下那个推平的时间戳
现在要求的是 \(tm>L\),\(L\le pl \le R\) 的点权和,二维数点即可
考虑加上之后怎么做,线段树单点修改就完了
妄想感伤代偿联盟
类似于把两个串拼起来求个 border,之后和串长取 \(\min\)
容易联想到AC自动机,之后从需要后缀的串跳 fail 指针,相当于把这个和需要前缀的链取交,暴力跳fail \(O(n)\),之后如果树剖链上 \(\max\) 就是 \(O(n\log^2 n)\) 的
考虑优化,发现因为权值是深度,所以权值单调,又因为一个点会对子树产生贡献,所以区间推平单点查询就好了,复杂度 \(O(n\log n)\)
法阵
写了再说
连通块
是经典结论,一个点最远距离必是直径一个端点,所以等价于求直径,又因为直径可以合并,做完了
军队
开局那个是矩形加,扫描线一下,变成区间加全局查排名
这玩意可以根号做,但是因为查的数非常小,所以索性直接用线段树维护前 \(k\) 大的值以及个数,复杂度 \(O(km \log n)\)
然后对于查询,发现只需要记录比较小的一种性别,之后对能不能取到最值分治就好了,随便拆个式子,离线下来复杂度就是 \(O(n)\),在线复杂度带个二分的 \(\log\)
棋盘
不会
Wallpaper Collection
首先把那一坨不知道什么东西的限制翻译成人话,就是相邻两行选择的区间必须有交,考虑朴素 dp
设 \(dp_{i,j,k}\) 表示选到了第 \(i\) 行,选了 \([j,k]\) 的最大价值和
容易写出方程 \(dp_{i,j,k}=\max\limits_{[j,k]\cap[l,r]} dp_{i-1,l,r} + val(j,k)\)
这玩意是 \(O(n^5)\) 的,墨迹的要死,考虑优化
发现其实有交相当于有一个重合的点就好了,所以把状态优化成两维的,\(dp_{i,j}\) 表示选到了第 \(i\) 行,选了 \(j\) 的最大价值和
转移依旧显然 \(dp_{i,j}=\max\limits_{p \le \min (j,k),q \ge \max (j,k) } dp_{i-1,k}+val(p,q)\)
发现还是 \(O(n^5)\),但是那个 \(val(p,q)\) 可以直接用最大后缀之类的优化掉,发现 \(O(n^3)\) 了
接着试图把那个 \(val(p,q)\) 拆开,就是 \(val(j,k)+f(j)+f(k)\) 然后可以拆出来一堆只依赖一个变量的式子,直接用数组记录最优决策就做完了
机动车驾驶员考试
好题
把逆天题面转化一下,得好题面,现在有一个数 \(x\),每次对其进行 \(x-1 \to x\),可能会在一些地方使整个东西乘 \(2\),也就是 \(2^kx-2^k\),\(k\) 是恰好落在这里的修改个数
其实就是求这些函数按时间顺序最少复合起来几个能让 \(x=0\)
因此考虑在时间上建出线段树,对于 \(f\) 和 \(g\),我们定义 \(f \circ g=f(g(x))\)
之后维护一个 \(x_{min}\) 也就是使 \(f(x)>0\) 的最小正整数就可以线段树上二分求答案了
直接按照上式暴力合并和修改就好了,发现一个问题,函数的斜率和截距都可能过大,导致无法存储,\(x_{min}\) 只能算出来分数,取模之后没办法比较大小
发现 \(x_{min} \le 10^9\),因为对于一个结点,它的 \(x_{min}\) 随着修改的增加一定单调不增,而初始状态满足 \(x_{min} \le 10^9\)
所以只需要大力分讨,由于不能解方程,只能用 \(\frac{\delta y}{\delta k}={\delta x}\)
之后我们判定当 \(x\) 进入当前子树,执行 \(x=f(x)\) 之后是否取过模就好了
记得离散化
最短路
发现需要高精,寄
考虑高精的实现,是加 \(2^k\) 和比较大小,尝试查看其二进制表示下特殊的地方,发现只要支持:
- 查找这一位上的数
- 修改这一位上的数
- 查找这一位向前第一个 \(0\)
- 同时修改几个不同位上的数
- 查询两个数中第一个不同的位置
- 可以快速迭代和赋值,不占用太大空间
发现主席树可以维护,封一个主席树高精就好了
魔卡少女樱
考虑一个朴素 dp,差分转化题面之后就变成了选择一个 \(n-1\) 项的正整数序列,不选三的倍数,贡献是 \(dp_{n,m} \times (m-sum)\) (sum是序列元素之和)
这就是 \(O(n(m-n))\) 做法,可以获得 \(80\) 高分
那么我们现在考虑将所有三都拿出来,以后再插,发现有 \(dp_i=\dbinom{n}{m-n}\)
接着前缀和一下,把三插板扔进去,做完了
声之形
没改出来
博弈
发现一个结论:先手必胜当且仅当有一个数的出现次数是奇数
求所有数的出现次数是偶数
异或哈希就好了
跳跃
发现如果没有那个烦人的非负限制,我们的 \(k\) 又很大,一定直接跳到一个地方,使其后缀最大连续段最大,然后不断跳过整个连续段就好了
那正常的时候也可以一样跳,只不过不无脑跳最大的,都可以跳,发现如果跳到另一个连续段应该先跳到能跳到的比较大的,之后跳两次才可能跳到更大的了
所以直接 \(O(n^2)\) dp 之后对最后停在所有位置取 \(\max\) 即可
圣诞树
特殊性质:主席树
维护 \(\operatorname{mex}\),不难想到莫队,括号序莫队,第一次出现的时候加入,第二次删除,要支持删除,可以发现值域分块可以解决这个问题,分块修改 \(O(1)\),查询 \(O(\sqrt n)\) 总复杂度 \(O(n\sqrt n)\)
思考跑的更快的 polylog 做法,要用到本题同种颜色只出现两次的性质,首先整体二分可以用一个 \(\log\) 的代价把问题转化成链上数颜色,扫每个颜色依次考虑对每个位置的贡献就好了,是矩形加,单点查,扫描线即可