其他分享
首页 > 其他分享> > Solution - NOI 2022

Solution - NOI 2022

作者:互联网

游记

目前只有两个题题解(代码没有),啥时候数据出了我再来补剩下的。

众数

Solution

有个题叫「POI2014」Couriers,这个题启示我们实际上问题等价于询问哪个数出现次数最多,最后只需要判断是否超过一半即可。

考虑线段树,对于一个序列,开一棵线段树维护上面的权值,单个序列的查询可以在线段树上面走,选择大的那一边走下去,最后的就是答案,多个序列可以考虑 \(m\) 个线段树一起走,同样选择大的一边,注意到 \(\sum m\le 5\times 10^5\),所以这样做复杂度是对的。

查询解决了,接下来考虑修改,修改在线段树上的影响不过是单点改和合并,这些都是简单的,但是注意到我们要维护每个序列的末尾,以及合并两个序列,可以使用启发式合并做到 \(O(n\log n)\)。

更优的想法是,可以使用链表的形式来维护,因为我们只需要知道末尾元素,而合并操作可以直接把一个链表的尾部元素的 next 指针指向另一个链表的开头元素,从而做到线性。

总时间复杂度线性对数,但是据说有高论可以做到线性,我还不会。

赛时我实现了这个做法,但是因为不明原因的链表写挂,所以只有 \(75\) 分。

挑战 NPC II

Solution

提示里面写的很好,本题需要使用树哈希,考虑到树哈希的本质是将一个子树映射成一个数值,也就是可以方便地判断两个子树是否相等,由此我们考虑一个构造过程:

首先使用树哈希求出两棵树(下文分记为 \(T_1,T_2\))每一棵子树的哈希值,考虑如何匹配两棵树的子树,一个显然的事情是,我们希望被匹配的两棵子树得是同构的,那么我们先将这些同构的找出,剩下的子树存起来。

注意到 \(T_1\) 剩余的子树个数一定需要大于等于 \(T_2\) 剩余的子树个数,同时 \(T_1\) 剩余的子树个数必须且必定 \(\le k\),否则无解。

考虑将 \(T_1\) 与 \(T_2\) 剩余的子树进行匹配并重复递归执行上述过程,我们希望求出某一个匹配,其中删点数量恰为某一个值,但是实际上我们并不能快速计算这个东西,所以只能暴力枚举 \(k!\) 种匹配递归。

由此,我们得到了一个 \(O(n\log n+k!n)\) 的算法,可以通过。

笔者没有学过树哈希,所以考场上编造了一个树哈希算法,其表现不错,可以拿到 \(92\) 分,这里就不说了,下面是几个可能可以通过的树哈希算法(笔者也没有具体实现):

  • 钦定一个 \(B\),满足 \(B>>h_i\),在求 \(h_u\) 的过程中排序儿子的 \(h\),从小到大执行一个类似字符串哈希的过程,即求出 \(\sum h_v\times B^i\),然后加上 \(u\) 的信息。
  • 将树转成括号序列后,对于括号序列进行字符串哈希。

标签:子树,匹配,2022,线段,Solution,链表,哈希,序列,NOI
来源: https://www.cnblogs.com/cnyzz/p/16629062.html