在讲正解之前,先播一个小故事:

xay 复杂度错误过题。将操作按照时间分块,块内他令所有置换环都必须有至少一个“黑点”。

可以通过没有修改 \(p\) 操作,同时 \(p_i=i\),把黑点的个数卡到 \(O(n)\)。这样复杂度就是 \(O(nq\log n)\) 了。

被我 hack 的记录


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的更多相关文章

  1. 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 ...

  2. 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+ ...

  3. 论文解读(JKnet)《Representation Learning on Graphs with Jumping Knowledge Networks》

    论文信息 论文标题:Representation Learning on Graphs with Jumping Knowledge Networks论文作者:Keyulu Xu, Chengtao ...

  4. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  5. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  6. JavaScript Array对象

    介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...

  7. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  8. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

  9. javascript之活灵活现的Array

    前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...

随机推荐

  1. 深入理解ES6之《用模块封装代码》

    什么是模块 模块是自动运行在严格模式下并且没有办法退出运行的Javascript代码 在模块的顶部this的值是undefined 其模块不支持html风格的代码注释除非用default关键字,否则不 ...

  2. JavaScript 小技巧 数组去重

    const array = [1, 2, 3, 3, 5, 5, 1]; const uniqueArray = [...new Set(array)]; console.log(uniqueArra ...

  3. 项目中常用到的布局 flex

    1. 没header,footer固定 html<div class="page"> <div class="top"> <div ...

  4. 论文解读(GRCCA)《 Graph Representation Learning via Contrasting Cluster Assignments》

    论文信息 论文标题:Graph Representation Learning via Contrasting Cluster Assignments论文作者:Chun-Yang Zhang, Hon ...

  5. 渗透测试中为什么https抓包是明文传输?

    网站用的是https抓包是明文传输,为什么能看到https报文的明文? https其实就是 http + SSL/TLS 两种协议的合体.http协议是应用层协议,而SSL/TLS是传输层协议. 那问 ...

  6. Edu CF 103 Div. 2 (A. K-divisible Sum, B. Inflation贪心),被黑客攻了,,惨掉rank, 思维除法与取余, 不太擅长的类型

    2021-01-29 题目链接: Educational Codeforces Round 103 (Rated for Div. 2) 题目 A. K-divisible Sum You are g ...

  7. Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务

    前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务.多组织共同运行维护Orderer服务中,我们已经完成了让普通组织运行维护 Orderer 服务,但是 ...

  8. 【面试普通人VS高手系列】Dubbo的服务请求失败怎么处理?

    今天分享的面试题,几乎是90%以上的互联网公司都会问到的问题. "Dubbo的服务请求失败怎么处理"? 对于这个问题,我们来看一下普通人和高手的回答. 普通人: 嗯- 我记得, D ...

  9. Python爬虫__微博某个话题的内容数据

    1 # -*- coding: utf-8 -*- 2 # @Time : 2020/8/18 15:39 3 # @Author : Chunfang 4 # @Email : 3470959534 ...

  10. Apache Doris ODBC外表之Postgresql使用指南

    Apache Doris 社区 2022 年的总体规划,包括待开展或已开展.以及已完成但需要持续优化的功能.文档.社区建设等多方面,我们期待有更多的小伙伴参与进来讨论.同时也希望多多关注Doris,给 ...