【口胡】Ynoi刷题记录
[Ynoi2019 模拟赛] Yuno loves sqrt technology III
分块后,预处理 F i , j F_{i,j} Fi,j表示第 i ∼ j i\sim j i∼j块的众数的出现次数。
用vector按顺序存每个数值所有元素的出现位置。
再记录每个元素在相应vector里的下标 p p p。
考虑询问,中间的直接使用预处理出的 F i , j F_{i,j} Fi,j的值即可。设当前的答案 a n s = F i , j ans=F_{i,j} ans=Fi,j。
考虑边界的元素。这里我们运用迭代的思想。对于右边的边角元素 x x x,如果它的出现次数比ans大,那么 p x − a n s p_x-ans px−ans 的元素 y y y 当然大于等于 l l l 。这个判断是O(1)的。
显然,由于边界的数最多 2 n 2\sqrt n 2n 个,所以最多使得答案增加 2 n 2\sqrt n 2n 。
每次询问对 O ( n ) O(\sqrt n) O(n )个元素检查,++ans
的次数为 O ( n ) O(\sqrt n) O(n )次。所以查询的时间复杂度为 O ( m n ) O(m\sqrt n) O(mn )。
总时间复杂度 O ( ( n + m ) n ) O((n+m)\sqrt n) O((n+m)n ),空间复杂度 O ( n ) O(n) O(n)。
[Ynoi2019 模拟赛] Yuno loves sqrt technology II
树状数组+莫队的时间复杂度是 O ( n l o g n m ) O(nlogn\sqrt{m}) O(nlognm )
考虑优化,我们发现我们的某一次询问其实是可以差分的。
即每次右指针右移的时候,都有这样的一组询问: l − r l-r l−r中有多少数比 a r a_r ar大
然而这个东西可以差分: [ 1 , r ] [1,r] [1,r]中比 a r a_r ar大的数的数量减去 [ 1 , l − 1 ] [1,l-1] [1,l−1]中比 a r a_r ar大的数的数量。
对于前面那一坨可以用树状数组做。
后面那一坨询问离线下来处理即可。
这个时候我们一共存了 n m n\sqrt m nm 组移动(莫队复杂度,总移动次数)也就是要处理 n m n\sqrt m nm 组询问。
然而我们可以平衡它的复杂度,因为我们要处理 n m n\sqrt m nm 询问,却只需要插入 O ( n ) O(n) O(n)组数(即左端点扫过去的过程只移动 n n n 次)
可以使用一个插入 O ( n ) , O(\sqrt n), O(n ),查询 O ( 1 ) O(1) O(1)的数组结构 − > -> −>值域分块。
对于莫队中的四种移动分 4 4 4类讨论,最后需要从 1 − n 1-n 1−n用左端点扫一遍还需要再用右端点从 n − 1 n-1 n−1扫一遍。
这样复杂度就被平衡到了 O ( n m + n n ) O(n\sqrt m+n\sqrt n) O(nm +nn )辣。
但是这样做要把 n m n\sqrt m nm 移动存下来,空间吃不下。
我们发现其实莫队的移动有规律,当右端点移动的时候,其左端点并没有发生任何移动,我们可以用 ( l , s t , e d , 1 / − 1 ) (l,st,ed,1/-1) (l,st,ed,1/−1)来表示。
同理,当左端点移动的时候,右端点也没有发生任何移动。
这样空间复杂度就变成了 O ( M ) O(M) O(M)。
本题的[st,ed]如果是 l l l的变化区间,就只把端点 s t st st, e d ed ed存进vector数组,当i=st时把询问加入,i=ed+1时把询问删除即可。操作总数仍然只有 O ( n m ) O(n\sqrt{m}) O(nm )次。
【口胡】Ynoi刷题记录相关推荐
- LeetCode刷题记录15——21. Merge Two Sorted Lists(easy)
LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) 目录 LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) ...
- LeetCode刷题记录14——257. Binary Tree Paths(easy)
LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...
- LeetCode刷题记录13——705. Design HashSet(easy)
LeetCode刷题记录13--705. Design HashSet(easy) 目录 LeetCode刷题记录13--705. Design HashSet(easy) 前言 题目 语言 思路 源 ...
- LeetCode刷题记录12——232. Implement Queue using Stacks(easy)
LeetCode刷题记录12--232. Implement Queue using Stacks(easy) 目录 LeetCode刷题记录12--232. Implement Queue usin ...
- LeetCode刷题记录11——290. Word Pattern(easy)
LeetCode刷题记录11--290. Word Pattern(easy) 目录 LeetCode刷题记录11--290. Word Pattern(easy) 题目 语言 思路 源码 后记 题目 ...
- LeetCode刷题记录10——434. Number of Segments in a String(easy)
LeetCode刷题记录10--434. Number of Segments in a String(easy) 目录 LeetCode刷题记录9--434. Number of Segments ...
- LeetCode刷题记录9——58. Length of Last Word(easy)
LeetCode刷题记录9--58. Length of Last Word(easy) 目录 LeetCode刷题记录9--58. Length of Last Word(easy) 题目 语言 思 ...
- LeetCode刷题记录8——605. Can Place Flowers(easy)
LeetCode刷题记录8--605. Can Place Flowers(easy) 目录 LeetCode刷题记录8--605. Can Place Flowers(easy) 题目 语言 思路 ...
- LeetCode刷题记录7——824. Goat Latin(easy)
LeetCode刷题记录7--824. Goat Latin(easy) 目录 LeetCode刷题记录7--824. Goat Latin(easy) 题目 语言 思路 后记 题目 题目需要将一个输 ...
最新文章
- 漫画:程序员相亲图鉴,笑屎我了~
- tomcat结构分析
- 让人欲罢不能的Feed流系统是如何设计的?
- 使用Spring工厂模式管理多个类实现同一个接口
- html之CSS设计(文本、边框、列表标签、display设置、内外边距)
- JMM内存模型详解(一)
- 美国能限制linux内核,美国大学教授「故意」向 Linux 提交含 Bug 代码,内核管理员“封杀”明尼苏达大学...
- 分享128个简约模板PPT模板,总有一款适合你
- 电驴搜索服务器正在连接,电驴连接不上服务器导致无法搜索解决的方法介绍
- ES8316耳机驱动可以差分输入支持录音PEQ调节
- 新时期文学专题研究【1】
- IE无法打开internet站点已终止操作
- 安装了本地MySQL后,小皮面板上的MySQL就一直启动失败
- 用于桌面虚拟化和远程访问图形要求苛刻的 CAD、EDA 应用程序的高级解决方案
- PMP|一文带你正确认识产品经理和项目经理的区别
- 关于Ubuntu下的PDF阅读器
- [iOS] AFNetworking 的内存泄漏分析
- Ethereum Introduction
- java.lang.NoSuchMethodError的解决办法
- transparent透明
热门文章
- C#窗体设计中ToolTip的简单用法
- php decimal类型,decimal是什么类型
- BP神经网络及拟合实例
- 杭州电子科技大学计算机面试题,杭州电子科技大学自主招生面试试题综合素质答案技巧...
- PAT1080 Graduate Admission (30)
- C语言编写web server
- tushare获取沪深300指数历史_从Tushare获取历史行情数据
- 利用mshta调用运行js或vbs的
- 2016-2017-2 《Java程序设计》预备作业2总结
- 数能低压 1.5A单通道 LED驱动IC芯片 NU405应用电路