NOIP2024加赛5

  • 暴力操作(opt)

    拜谢丁真

    首先题目有一个很明显的性质:我们肯定只会对前 n+12 个数进行操作使它变小。

    最后的答案很明显没看出来具有二分答案的性质,考虑怎么 check。实则就是要判断前 n+12 个数是否都能 mid。我们可以方便的找出 ai 变成 mid 所需的除以的倍数,怎么统计代价。设 fi,j 表示考虑了前 i 种操作,除以的倍数为 j 的代价,然后跑完全背包即可,转移为:

    fi,j=min(fi1,j,fi,ji+ci)

    最后只在找所需除以的倍数的时候需要考虑一些细节。

  • 异或连通(xor)

    拜谢 GGrun

    将询问的 x 离线下来从小到大排序,考虑每条边会对哪些询问有贡献。建一颗 x 的 01 trie 树,每次从小到大往里插入 x。怎么判断每条边会对哪些询问有贡献?

    如果 k 该位为 1,另 ci 该位为 c,则在 trie 树上可以往 c1 走,此时异或为 1;也可以往 c 走,此时异或为 0,由于题目要求 cix<k,所以往 0 走的这颗子树下的所有 x 区间都是 ci 能有贡献的询问。重复这个操作,我们能找到所有的 cix<k 的区间,由于 trie 树的树高不超过 logk,所以每个 ci 能产生贡献的区间个数不超过 logk

    找到这些区间有什么用,考虑线段树分治。(虽然叫分治,但好像和分治没什么关系?)在线段树上每个点记录该区间有哪些 ci 可以产生贡献,开一个 vector 即可。由于上面已经得知区间个数 nlogk 个,所以显然是开的下的。我们在 trie 树上找 ci 能贡献的区间的时候就相当于区间加,直接 update 即可。

    查询的时候怎么办?首先,如果查询到线段树上的一个叶子节点 x,则说明我们肯定把所有能对 x 有贡献的边都算进来了,(考虑从上往下递归,每经过一个区间,就加上该区间 vector 里的标记)此时直接得出答案即可。然后,我们会退出该叶子节点,退出一个节点的时候,我们应该把该节点的标记都清空,减掉在该节点增加的贡献。用可撤销并查集即可维护,考虑一条边把两个连通块连接到一起,则 ansans+sizu×sizv,退出该节点的时候要减掉这些贡献。

  • 诡异键盘(keyboard)

    拜谢 Qyun

    题目要求用 n 个子串(可以选任意多次)拼成一个母串,每次可以删 k 个数的最小操作次数。考虑 n2 的 DP,设 fi 表示母串匹配到了第 i 个数,转移为:fi=fj+wj+1,i,其中 wx,y 为用子串凑出母串中区间 (x,y) 的最小代价。

    怎么预处理出这个 wx,y 数组?可以用一个 unordered_map 来存得到字符串 (x,y) 所需的代价。我们发现添加一个子串肯定都是想留下它的一个前缀,而得到这个前缀的所需的代价即为:删去多余部分(长度设为 t)所需的代价 +1。如果 t 的长度不为 k 的倍数,那我们肯定要想办法在后面添上其他的子串凑出另一个长度 t,使得 t+t0(modk)

    所以说我们还需处理出一个数组 gi,i[1,k) 表示在模 k 意义下,凑出长度为 i 的字符串的所需代价。类似于“同余最短路”,可以用 dijkstra 转移。

    DP 复杂度为 O(|S|2),求出 w 数组的复杂度为 O(|Si|),预处理 gi 数组为 O(klogk)

  • 民主投票(election)

    拜谢 9G

    首先 O(n2) 的暴力很显然,直接枚举每个 i,check 它是否可以获胜即可。怎么 check?有一个总的限制就是 fx<sizi1(除 i 节点以外),其中 fxx 获得的票数。对于每一个节点,我们贪心的考虑,它的儿子都把票投给它,如果满足限制则是合法的,否则就把多余的票上传到它的父亲节点。最终只需检验 f0 是否等于 0 即可,在递归的时候可以不递归 i 的子树。

    正解其实是在这上面的进一步优化。考虑先二分出一个最小的 s,满足全局的 fx<s1。对于 sizs 的点,肯定是可以获胜的,对于 siz<s1 的点,肯定是不能获胜的。对于 siz=s1 的点,有可能获胜,因为该点不合法是因为某点的 fxs2,但其实对于 i 来说 fi 可以等于 s2。我们把 s2 再带进去跑一遍,如果 f0=1 的话,则说明该点能够获胜,否则不能获胜。(考虑可以从 i 节点到根的路径上撤回一票,因为 fi 是可以等于 s2 的)

p

posted @   x_yin  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示