ICode9

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

洛谷 P5984 - [PA2019]Podatki drogowe(点分治+主席树+随机二分)

2022-08-10 18:02:56  阅读:179  来源: 互联网

标签:二分 洛谷 log PA2019 区间 Podatki 随机 权值 集合


洛谷题面传送门

首先点分治,对于重心为 \(x\) 的连通块,我们用主席树维护出 \(x\) 到连通块内每个点所组成的数,具体来说,主席树上下标为 \(1\) 的位置存储将权值转成 \(n\) 进制后 \(n^1\) 位上的值,下标为 \(2,3,\cdots,n\) 位上的值同理。这样显然我们可以通过主席树上二分在 \(\log n\) 的时间内比较两个 \(n\) 位 \(n\) 进制数的大小。然后我们将该连通块内所有权值存到一个系数 \(1\) 的集合内,然后再将所有属于以 \(x\) 为根的同一子树内的所有权值存到一个系数为 \(-1\) 的集合内,这样相当于一个数 \(X\) 的出现次数就是对于所有集合,计算集合内有多少对数和等于 \(X\),乘上集合的系数再求和。

二分答案。check 是容易的,直接在每个集合内进行 two pointers 即可,由于集合大小总和是 \(n\log n\) 的,而比较大小是 \(\log n\) 的,所以单次 check 是两只 log 的,现在比较麻烦的地方在于,值域是 \(n^n\) 的,因此直接二分需要进行 \(n\) 次二分,实在不能接受。不过需要认识到一个清醒的事实,我们二分的对象只有 \(n^2\) 个,有什么方法使得二分次数达到 \(\log n\) 呢?一个很直接的想法是二分排名然后根据排名推回对应的数,不过这不就是原问题吗(笑),显然不可行,这时有个 trick:随机二分,即在对应区间中等概率随机一个 \(mid\) 将区间分成两半,那么又该怎样等概率呢?每次二分到一个区间 \([l,r]\),我们先将所有集合中的元素打乱到一起并排序,对于每个权值 \(X\),我们找到权值在 \([l-X,r-X]\) 中的权值组成的区间,这显然是可以 two pointers 的。然后对这些区间进行带权随机,即将区间长度为随机的权随机出左边的部分,然后再在对应区间中随机出右边的部分。

时间复杂度 \(n\log^3n\)。

标签:二分,洛谷,log,PA2019,区间,Podatki,随机,权值,集合
来源: https://www.cnblogs.com/ET2006/p/luogu-P5984.html

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

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

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

ICode9版权所有