CF1588F Jumping Through the Array
在讲正解之前,先播一个小故事:
xay 复杂度错误过题。将操作按照时间分块,块内他令所有置换环都必须有至少一个“黑点”。
可以通过没有修改 \(p\) 操作,同时 \(p_i=i\),把黑点的个数卡到 \(O(n)\)。这样复杂度就是 \(O(nq\log n)\) 了。
CF1588F Jumping Through the Array
给定一个长为 \(n\) 的序列 \(a\) 以及排列 \(p\),实现以下操作:
- 给定 \(l,r\)。求 \(\sum\limits_{i=l}^{r} a_i\);
- 给定 \(x,y\)。我们将 \(i\to p_i\) 连成一个个置换环,将 \(x\) 所在环上的每个点点权加 \(y\);
- 给定 \(x,y\)。交换 \(p_x,p_y\)。
\(1\le n\le 2\cdot 10^5,-10^8\le a_i\le 10^8,1\le p_i\le n,1\le q\le 2\cdot 10^5\)。
时间限制 \(\text{8000ms}\),空间限制 \(\text{512MB}\)。
Solution
考虑按照时间根号分治,我们将连续 \(B\) 个操作一起处理。
我们将操作到的点(即 \(2\) 操作的 \(x\) 和 \(3\) 操作的 \(x,y\))染黑,只有这些黑点是进行操作的。
考虑操作前的每个置换环,它形如这样:

我们将其划分成若干条“链”(红色区域),可以发现操作中每条链都是以整体出现的,即 \(\Delta\) 相等:

而链只有 \(2B\) 个,因此我们只需要对每个链维护 \(\Delta\) 即可。
对于 \(1\) 操作,区间 \([l,r]\) 的点权和即为操作前的 \(\sum\limits_{i=l}^{r}a_i\) 再加上 \(\sum\limits_{每条链}\Delta \times 环内编号在[l,r]的点数\),复杂度 \(O(B\log n)\)。
对于 \(2\) 操作,它必然是给当前 \(x\) 所在的链,以及这条链所在的环的其他链,增加 \(y\),复杂度 \(O(B)\);
对于 \(3\) 操作,我们交换两个黑点连到的链编号,是 \(O(1)\) 的。
至此,我们可以在 \(O(\frac{q}{B}\cdot (B^2\log n+n))\) 复杂度解决。
取 \(B=\sqrt{n/\log n}\),时间复杂度 \(O(q\sqrt{n\log n})\)。
CF1588F Jumping Through the Array的更多相关文章
- Codeforces Round #598 (Div. 3) C. Platforms Jumping 贪心或dp
C. Platforms Jumping There is a river of width n. The left bank of the river is cell 0 and the right ...
- Codeforces Round #598 (Div. 3) C. Platforms Jumping
There is a river of width nn. The left bank of the river is cell 00 and the right bank is cell n+1n+ ...
- 论文解读(JKnet)《Representation Learning on Graphs with Jumping Knowledge Networks》
论文信息 论文标题:Representation Learning on Graphs with Jumping Knowledge Networks论文作者:Keyulu Xu, Chengtao ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- JavaScript Array对象
介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- 关于面试题 Array.indexof() 方法的实现及思考
这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...
- javascript之活灵活现的Array
前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...
随机推荐
- Python窗口学习之给按钮美化
tkinter的按钮很丑也很难改 怎么办呢? 最好的方法就是不用按钮! 给Label添加点击事件,和按钮的作用是一样的! 代码: #!/usr/bin/env python # -*- coding: ...
- CCF201512-2消除类游戏
问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...
- 小程序预览图片wx.previewImage
效果图: ====> ==> 代码: <image mode='aspectFill' bindtap='previewImage' data-src='{{dataList ...
- 使用flex的同时设置超出喜爱是省略号,
超出宽度,显示省略号 overflow:hidden; white-space:nowrap; text-overflow:ellipsis; 需要注意的是,在移动端在flex元素中的内容进行省略文字 ...
- CPU乱序执行问题
CPU为了提高执行效率,会在一条指令执行的过程中(比如去内存读数据,读数据的过程相较于CPU的执行速度慢100倍以上,cpu处于等待状态),这个时候cpu会分析接下来的指令是否正在执行的指令相关联,如 ...
- Postman大势已去
作为一名前端,日常开发过程中除了写业务代码,前后端联调更是重要的一环.但这一环却往往是整个开发中最繁琐也最累人的一环.任谁都想早点下班,然而提升联调效率并不是个纯技术相关的问题,而是需要有良好工作流程 ...
- RPC及Dubbo和ZooKeeper的安装
RPC及Dubbo和ZooKeeper的安装 RPC 通信有两种方式:HTTP(无状态协议,通信协议),RPC(远程过程调用) 它两的本质没有区别,只是功能有点不一样 官方解释: RPC是指远程过程调 ...
- C++五子棋(三)——判断鼠标有效点击
分析 在鼠标左键点击时,我们不能让新棋子在已有棋子的位置落下,同时我们还要让棋子在规定位置落下--棋盘线的交点处. 功能实现 创建数据类型 创建头文件chessData.h和源文件chessData. ...
- Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 【持续集成与交付快速入门必备】
Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 [持续集成与交付快速入门必备]
- Java学习day20
一个简单的鼠标点击在窗口画点的程序 今天学习了键盘监听和Swing窗口 Swing可以理解为是AWT的升级版本,方法名字等大都相似,例如Frame和JFrame AWT如果要关闭窗口,需要使用窗口监听 ...