模拟赛下半

模拟赛下半

那一天她离我而去

板子,写写吧

发现一个暴力是断掉源点周围若干边之后跑最短路,发现只要让最小环上的两条边不同时被断开就好了,考虑到两个数不同,二进制必有一位不同,所以按照编号的二进制位分组就好了,复杂度 O(mlogmlogn)

考虑一个更优秀的做法,建出最短路树(其实就是断掉最短路dag里面的一些边),发现只要枚举非树边,如果这条边两边的结点lca就是源点,直接更新答案就好了,复杂度 O(mlogm)

单调区间

不会 O(n),写个 O(nlogn)

首先肯定是扫描线,对每个左端点算能扩展到的最大右端点

发现可以在值域中画出两条直线代表这两个序列,在它们交点之后才有可能扩展不到,再仔细观察一下:

只有 中小大中 中大小中 两种才可能满足这玩意

开个值域树状数组,一边扫一边维护最后一个大于/小于某个数出现位置的数就好了,发现就是前缀 max

Kanon

水题,但是想写

发现每个雪球不可能超过前面的,所以直接思考如何确定中间的雪归谁

前缀和出来之后二分就完了

Summer Pockets

赛时想到了,结果没写上

考虑先放一个方向上的栅栏,发现分割成的区域里蝴蝶数量一定都是一样的,因为这些区域内部的最终连通块数量一定一样

所以我们可以直接把蝴蝶排序,枚举蝴蝶数量的约数,之后确定这一边的合法方案数,对于另一个方向,也是每个栅栏可以放置的区间满足两两不交,暴力做就好了

发现后面的暴力卡满是 O(n2) 的,前面枚举约数是 O(n) 的,所以复杂度大概是这个样子,加上这两边都根本跑不满,所以快得飞起

ynoi 题

考虑单点怎么做,显然带修莫队和分块都能肆意水过,就是维护一个 pre

考虑我们实际上查询的是什么 pre<l 并且 l<pl<r 的数个数,这不是二维数点么,加上修改,就是三维数点

发现根据颜色段均摊原理,pre 数组和修改颜色块次数一样,是 O(m)

于是变成了三维偏序板子,CDQ就能做到 O(nlog2n)

Non-breath oblige

又是 ynoi 题

先不带交换操作,
就是说对于一个询问,只有最近的一次影响到它的推平会有贡献,所以我们直接记录一下那个推平的时间戳

现在要求的是 tm>LLplR 的点权和,二维数点即可

考虑加上之后怎么做,线段树单点修改就完了

妄想感伤代偿联盟

类似于把两个串拼起来求个 border,之后和串长取 min

容易联想到AC自动机,之后从需要后缀的串跳 fail 指针,相当于把这个和需要前缀的链取交,暴力跳fail O(n),之后如果树剖链上 max 就是 O(nlog2n)

考虑优化,发现因为权值是深度,所以权值单调,又因为一个点会对子树产生贡献,所以区间推平单点查询就好了,复杂度 O(nlogn)

法阵

写了再说

连通块

是经典结论,一个点最远距离必是直径一个端点,所以等价于求直径,又因为直径可以合并,做完了

军队

开局那个是矩形加,扫描线一下,变成区间加全局查排名

这玩意可以根号做,但是因为查的数非常小,所以索性直接用线段树维护前 k 大的值以及个数,复杂度 O(kmlogn)

然后对于查询,发现只需要记录比较小的一种性别,之后对能不能取到最值分治就好了,随便拆个式子,离线下来复杂度就是 O(n),在线复杂度带个二分的 log

棋盘

不会

Wallpaper Collection

首先把那一坨不知道什么东西的限制翻译成人话,就是相邻两行选择的区间必须有交,考虑朴素 dp

dpi,j,k 表示选到了第 i 行,选了 [j,k] 的最大价值和

容易写出方程 dpi,j,k=max[j,k][l,r]dpi1,l,r+val(j,k)

这玩意是 O(n5) 的,墨迹的要死,考虑优化

发现其实有交相当于有一个重合的点就好了,所以把状态优化成两维的,dpi,j 表示选到了第 i 行,选了 j 的最大价值和

转移依旧显然 dpi,j=maxpmin(j,k),qmax(j,k)dpi1,k+val(p,q)

发现还是 O(n5),但是那个 val(p,q) 可以直接用最大后缀之类的优化掉,发现 O(n3)

接着试图把那个 val(p,q) 拆开,就是 val(j,k)+f(j)+f(k) 然后可以拆出来一堆只依赖一个变量的式子,直接用数组记录最优决策就做完了

机动车驾驶员考试

好题

把逆天题面转化一下,得好题面,现在有一个数 x,每次对其进行 x1x,可能会在一些地方使整个东西乘 2,也就是 2kx2kk 是恰好落在这里的修改个数

其实就是求这些函数按时间顺序最少复合起来几个能让 x=0

因此考虑在时间上建出线段树,对于 fg,我们定义 fg=f(g(x))

之后维护一个 xmin 也就是使 f(x)>0 的最小正整数就可以线段树上二分求答案了

直接按照上式暴力合并和修改就好了,发现一个问题,函数的斜率和截距都可能过大,导致无法存储,xmin 只能算出来分数,取模之后没办法比较大小

发现 xmin109,因为对于一个结点,它的 xmin 随着修改的增加一定单调不增,而初始状态满足 xmin109

所以只需要大力分讨,由于不能解方程,只能用 δyδk=δx

之后我们判定当 x 进入当前子树,执行 x=f(x) 之后是否取过模就好了

记得离散化

最短路

发现需要高精,寄

考虑高精的实现,是加 2k 和比较大小,尝试查看其二进制表示下特殊的地方,发现只要支持:

  1. 查找这一位上的数
  2. 修改这一位上的数
  3. 查找这一位向前第一个 0
  4. 同时修改几个不同位上的数
  5. 查询两个数中第一个不同的位置
  6. 可以快速迭代和赋值,不占用太大空间

发现主席树可以维护,封一个主席树高精就好了

魔卡少女樱

考虑一个朴素 dp,差分转化题面之后就变成了选择一个 n1 项的正整数序列,不选三的倍数,贡献是 dpnm×(msum) (sum是序列元素之和)

这就是 O(n(mn)) 做法,可以获得 80 高分

那么我们现在考虑将所有三都拿出来,以后再插,发现有 dpi=(nmn)

接着前缀和一下,把三插板扔进去,做完了

声之形

没改出来

博弈

发现一个结论:先手必胜当且仅当有一个数的出现次数是奇数

求所有数的出现次数是偶数

异或哈希就好了

跳跃

发现如果没有那个烦人的非负限制,我们的 k 又很大,一定直接跳到一个地方,使其后缀最大连续段最大,然后不断跳过整个连续段就好了

那正常的时候也可以一样跳,只不过不无脑跳最大的,都可以跳,发现如果跳到另一个连续段应该先跳到能跳到的比较大的,之后跳两次才可能跳到更大的了

所以直接 O(n2) dp 之后对最后停在所有位置取 max 即可

圣诞树

特殊性质:主席树

维护 mex,不难想到莫队,括号序莫队,第一次出现的时候加入,第二次删除,要支持删除,可以发现值域分块可以解决这个问题,分块修改 O(1),查询 O(n) 总复杂度 O(nn)

思考跑的更快的 polylog 做法,要用到本题同种颜色只出现两次的性质,首先整体二分可以用一个 log 的代价把问题转化成链上数颜色,扫每个颜色依次考虑对每个位置的贡献就好了,是矩形加,单点查,扫描线即可

posted @   wang54321  阅读(35)  评论(6编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示