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 ...
随机推荐
- WePY为了兼容支付宝小程序,改了好几十行代码
早在16年底,就有流出支付宝在做小程序的事情,见<如何看待支付宝推出「小程序」?>,今年8月18号支付宝版本小程序的终于公测,十月怀胎实属不易啊. 紧接着就有人给我提ISSUE了: 此时我 ...
- 前端每日实战:96# 视频演示如何用纯 CSS 和 D3 创作一艘遨游太空的宇宙飞船
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMqNmv 可交互视频 此视频是可 ...
- ES6-11学习笔记--Symbol
Symbol:一种新的原始数据类型 声明方式: let s1 = Symbol() let s2 = Symbol() console.log(s1); // Symbol() console.l ...
- String能变化吗?和StringBuffer的区别是什么
[新手可忽略不影响继续学习]看 过上面例子的童鞋一定会觉得很奇怪,s = s + s1.charAt(i); 马克-to-win, s不是老在变化吗?其实s = "";时,虚拟机会 ...
- potoshop cs6安装配置16错误解决办法(win10系统)
问题截图如下: 解决方法: 右击图标选择属性:选择兼容性-->兼容模式-->以管理员身份运行-->应用 然后就可以打开了!
- uniapp热更新和整包升级
一. uniapp热更新 (热更新官方文档) 很多人在开发uniapp的时候, 发现热更新失效问题(或者热更新没有更新manifest里的新增模块,SDK,原生插件包括云插件), 其实uniapp官 ...
- HTML2Canvas使用总结
1:指定要生成的DOM元素id 2: 某些图片动态赋值src的url或者base64可能不会被立即渲染:可以设置一个定时器解决 3:可以调用次方法得到的canvas元素转一下格式 png/jpg 4: ...
- 安装scrapy速度慢解决方案
使用终端pip安装scrapy龟速 解决方案: 使用清华源下载 清华园链接 https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ win+R打开cmd 输入p ...
- Codeforces Round #700 (Div. 2) --- B(思维)
传送门 有必要提醒自己一下, 先把题读利索了(手动捂脸) 题目 B. The Great Hero The great hero guards the country where Homer li ...
- Java实现平滑加权轮询算法--降权和提权
上一篇讲了普通轮询.加权轮询的两种实现方式,重点讲了平滑加权轮询算法,并在文末留下了悬念:节点出现分配失败时降低有效权重值:成功时提高有效权重值(但不能大于weight值). 本文在平滑加权轮询算法的 ...