ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Solution - NOI 2022

2022-08-26 20:34:07  阅读:222  来源: 互联网

标签:子树 匹配 2022 线段 Solution 链表 哈希 序列 NOI


游记

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

众数

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有