首页 > 其他分享 >P7470 [NOI Online 2021 提高组] 岛屿探险

P7470 [NOI Online 2021 提高组] 岛屿探险

时间:2023-11-29 11:45:58浏览次数:27  
标签:01 log trie P7470 boldsymbol 2021 mathcal 节点 NOI

我永远喜欢数据结构。

题目传送门

  • 给出 \(n\) 个二元组 \((a_i,b_i)\),有 \(q\) 次询问,每次给出 \(l_i,r_i,c_i,d_i\),求有多少个 \(j\) 满足 \(j\in[l_i,r_i]\) 且 \(a_j\oplus c_i\le \min\{b_j,d_i\}\)。

  • \(n,q\le 10^5\),设值域为 \(V\),\(|V|\le 2^{24}\)。

  • \(2.00\,\text{s}\,/\,256.00\,\text{MB}\)。

一句话题解:离线,拆 \(\min\),考虑贡献。

我们知道线段树可以将一个区间拆成 \(\mathcal{O}(\log n)\) 个不交的节点,使得这些节点的并等于给定的区间。

于是我们考虑离线,在线段树上将每个询问拆成 \(\mathcal{O}(\log n)\) 个子区间,分别求解这些子区间的答案。

考虑对于线段树的一个节点 \([L,R]\),求解挂在它上面的询问。将这些询问按照 \(d_i\) 从小到大排序,同时将节点内的二元组按照 \(b_j\) 从小到大排序。

对于一个询问,分成 \(b_j<d_i\) 和 \(b_j\ge d_i\) 两类二元组。不难发现排序后存在一个 \(\boldsymbol k\) 使得 \(\boldsymbol{k\in[L,R]}\) 且当 \(\boldsymbol{j\in[L,k)}\) 时,\(\boldsymbol{b_j<d_i}\);当 \(\boldsymbol{j\in[k,R]}\) 时,\(\boldsymbol{b_j\ge d_i}\)

即,两类二元组分别在一个连续区间内。

  • 对于 \(b_j\ge d_i\) 的部分,\(\min\{b_j,d_i\}=d_i\)。

    这部分较为平凡。就是求区间内有多少个数异或定值后不超过定值。使用 01 trie 维护,将区间内所有数加入 01 trie,统计根节点(即全局)的答案。

    考虑一个子问题:统计以 \(u\) 为根的子树内的答案。维护每个点子树内部的答案。讨论 \(d_i\) 当前位是 \(0\) 还是 \(1\) 即可。若是 \(1\),则另这一位取 \(0\) 的数都满足条件需要被统计。这样的数在当 \(u\) 的某个儿子内。维护一个 \(sz_u\) 表示以 \(u\) 为根的子树内,有多少个询问内的数。用 \(sz_u\) 以及递归儿子求解即可。

  • 对于 \(b_j<d_i\) 的部分,\(\min\{b_j,d_i\}=b_j\)。

    对于区间内的每个二元组,将其插入 01 trie,并考虑它会对哪些询问的 \(c_i\) 产生贡献。此时的 01 trie 是对于 \(c_i\) 维护的。

    同样考虑这个二元组会被以 \(u\) 为根的子树内的哪些数统计。讨论 \(b_j\) 当前位是 \(0\) 还是 \(1\)。如果是 \(1\),意味着另这一位为 \(0\) 的 \(c_i\) 都会统计到这个二元组。这样的 \(c_i\) 也在某个儿子的 \(u\) 的子树内。即子树内所有数的贡献 \(+1\)。此时 \(sz_u\) 数组变成懒标记,使得某个叶子的初始答案,加上它即其祖先的懒标记后,等于其在当前加入的二元组构成的集合中的答案。

    对于一个询问,查询 \(c_i\) 的答案即可。由于初始空集合答案为 \(0\),只需要统计根链上所有点的标记之和。

    本质上是动态开点线段树。

由于实现的原因,01 trie 需要支持删除操作。因此我们不能简单地把空节点理解成不存在的节点。此处 01 trie 上的空节点定义为,仅当 \(\boldsymbol{sz_u=0}\) 时,\(\boldsymbol{u}\) 为空。注意那个是必要条件。这样我们不去计算空节点的原因不是因为其不存在,而是因为其没有贡献

同样要再次强调这句话,本质上是动态开点线段树

我们发现,由于排过序,若按顺序处理询问,\(\boldsymbol{k}\) 单调不降

每次 \(k\) 移动时,将当前位置从第一类的 01 trie 中删除,加入第二类的 01 trie。这样在一个线段树节点内,一个二元组被操作的次数是 \(\mathcal{O}(1)\) 的。单次操作时间复杂度为 \(\mathcal{O}(\log |V|)\),一个二元组会在 \(\mathcal{O}(\log n)\) 个线段树节点中被操作。

对于一个询问,拆分成了 \(\mathcal{O}(\log n)\) 段,一段查询的时间复杂度为 \(\mathcal{O}(\log |V|)\)。

所以,时间复杂度为 \(\mathcal{O}((n+q)\log n\log |V|)\),空间复杂度为 \(\mathcal{O}((n+q)\log |V|)\)。

提交记录(\(\color{white}\colorbox{limegreen}{Accepted}\) \(\color{limegreen}\bf 100\),\(\bf 8.00\,s\,/\,54.18\,MB\)) 代码

标签:01,log,trie,P7470,boldsymbol,2021,mathcal,节点,NOI
From: https://www.cnblogs.com/MnZnOIerLzy/p/17864462.html

相关文章

  • 2023-2024-1 20211327 myxxd(课上测试)
    myxxd(课上测试)学***d的使用,提交至少3个应用截图xxd的主要功能是什么?需要使用什么系统调用来实现?写出你的推导过程,命令xxd主要用于查看文件的十六进制表示,并提供了一些额外的功能,如生成C语言风格的数组表示。它的主要功能包括:查看文件的十六进制表示:显示文件内容的十......
  • P1955 [NOI2015] 程序自动分析
    P1955[NOI2015]程序自动分析基本思路考虑到了不等号的不可传递性,所以决定只开相等的并查集。然后突发奇想,觉得可以在找父亲的过程中判断是不是冲突。然而这样就不能路径压缩,显然超时。并且,根本没看清楚数据范围,实际上这题的数很大,裸开数组会爆炸。这是一开始的代码#inclu......
  • springcloud~spring-cloud-starter-alibaba-nacos-discovery-2021.0.1.0配置方式变更
    nacos的配置方式发生改变,之前的方式不再适用,我们需要进行调整包依赖pom.xml代码,引入基础pom依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.1.0<</ve......
  • P7561 [JOISC 2021 Day2] 道路の建設案
    题意给定\(n\)个点,求平面上,曼哈顿距离最近的\(k\)点对。Sol仔细想想就会发现,曼哈顿距离不好做最近\(k\)点对。考虑转成切比雪夫距离。\(x'=x+y,y'=x-y\)。二分答案,每次\(check\)一个\(dis\),询问距离小于\(dis\)的点对是否有\(k\)个。\(check\)是平凡......
  • P1090 [NOI洛谷P2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
    可以用堆来实现,或者更简单一点的优先队列优先队列:#include<queue>priority_queue<int,vector<int>,greater<int>>q;因为每次合并后,最小的两个值都会更新,所以可以很好的利用优先队列内元素有序的特点,减少因反复排序带来的时间复杂度;一开始我用STL自带的排序sort,报了5个TLE,后来意......
  • NOIP2023 双序列拓展
    洛谷传送门首先\(x_1=y_1\)显然不合法。若\(x_1>y_1\)就把\(x,y\)全部取相反数,这样就只用考虑\(x_1<y_1\)的情况了。然后考虑一个\(O(nmq)\)的dp,设\(f_{i,j}\)为拓展\(X\)的前\(i\)个元素和\(Y\)的前\(j\)个元素是否可行。那么若\(x_i<y_j\)则......
  • NOIP2023 游记
    Day0打摆。打摆。打摆。看tarjan。打摆。打摆。打摆。Day1早上很早到了附中,发现准考证上没有照片,黑糊糊一片,被教练强行紧急更换了一个,感觉不换其实也没什么关系。进考场,发现在最后一排,旁边不认识,前面不认识,前面的旁边不认识,sad。然后发密码,开T1,发现会了,15min写完......
  • P9447 [ICPC2021 WF] Spider Walk 题解
    更好的阅读体验很有意思的一道题。设\(f_i\)表示第\(i\)根线的答案,首先有一个关键结论:任意两根相邻的线答案只差一定小于\(1\)。原因显然,可以在无限远的地方加一根线来构造。该结论可以扩展一下,对于距离为\(d\)的两根线,答案之差不会超过\(d\)。考虑进行倒着加线,考虑加......
  • P1970 [NOIP2013 提高组] 花匠
    显然只选峰或者谷,所以记录当前走势是向上还是向下,出现转折时答案加一即可。因为存在相同的元素,所以开头的走势要特判,把最前面连续相同的一段看成一个元素,因为不确定会转变成哪种走势。后面遇到相同则可以正常做,因为前面走势已经确定了,相当于自动忽略了相同的元素。......
  • Minitab 2021:让数据分析变得更简单,更直观 win版
    Minitab2021是一款广受欢迎的统计分析管理软件,它为用户提供了强大的数据处理和分析能力,适用于各种行业和领域。通过Minitab2021,用户可以轻松应对各种数据分析挑战,从基本的统计分析到复杂的数据挖掘,都能得到准确、可靠的结果。点击获取Minitab2021Minitab2021的界面简洁......