首页 > 其他分享 >数据结构杂烩

数据结构杂烩

时间:2023-08-04 09:12:27浏览次数:39  
标签:now 线段 杂烩 序列 区间 操作 维护 数据结构

线段树

P4681 [THUSC2015]平方运算

简要题意

给定一个序列,区间 .map([](int x) { x = x * x % p; });,区间求和。
p 给定,为小质数。\(N,M\le 105\)。

题解

而把一个数看作一个点,向其平方取模连一条边,则最终必然构成一个基环森林,注意到 \(P\)
很小,每个数经过至多 \(11\) 次迭代之后就会进入环中。对于一个区间,如果区间中的每个元素都已经在环里,则区间所有元素所在环的大小的 \(\operatorname{lcm}\),即为区间的循环节。而对于题目给出的 \(P\),\(\operatorname{lcm}\le 60\),记为 \(C\)。

先考虑初始是每个元素都在环内的时候怎么做:发现可以用线段树维护,对于每个区间,我们可以直接维护该区间的一个完整循环节,以及当前在循环节内的位置 \(now\),则如果要对整个区间进行 \(k\) 次修改,则直接让 \(now\) 向前移动 \(k\) 即可,故可以 \(O(1)\) pushdown,如果一个区间的子区间被修改了,那么在 pushup 的时候直接根据两个子区间的循环节算出当前区间的循环节即可,复杂度 \(O(C)\)。

如果一个区间内包含不在环内的元素,则无法维护循环节,我们只维护当前区间的和,需要 pushdown 时暴力递归向子区间 pushdown。由于每个元素经过至多 \(S=11\)
次操作后进入环,简单均摊分析发现这一部分增添的复杂度是 \(O(nSlogn)\) 的。

总时间复杂度 \(O(nlogn(C+S))\) 可以通过。

对于循环移位维护一个循环节和当前位置的指针是十分显然的。


CF526F Pudding Monster

线段树维护历史和,略。

P8969 Dream with Dynamic

简要题意

给定一个序列,区间加,区间 popcount,单点求值。

题解

对于一个操作序列 \(A\),如果 \(A\) 包含了至少一次 popcount 操作,记该次操作及以前的操作为 \(U\),以后的操作为 \(V\)。

注意到 \(U\) 操作后仅有 \([1,\operatorname{popcnt}(V)]\) 共 \(O(\log V)\) 种不同的结果,故我们可以把 \(V\) 的有效部分记为映射 \(V':[1,\operatorname{popcnt}(V)]\mapsto \mathbb{Z}\)。

对于 \(U\),其为一系列加法操作复合一个 popcount 操作,记录加法操作的总和即可。

对于两个操作序列 \(u,v\) 及其复合 \(u\circ v\),显然可以 \(O(\log V)\) 进行复合且结果仍可以使用以上方法记录。线段树维护即可,复杂度 \(O(n\log n\log V)\)。

record

2023 福建省队集训 Dream

简要题意

对于一个序列,维护:

  • 区间加减一。
  • 区间打标记,若有多个标记保留最小的。
  • 区间回溯到标记,若不存在标记或 标记大于当前值 则忽略。

单点查询。

题解

想到可以用线段树维护之后的推导是平凡的,只是稍微有一些繁琐。

(下面记的东西价值不大,以后遇到这种题能想到线段树维护就肯定能够做出来了)

若有回溯操作,一个操作序列仅需要保留信息 \((minL,set,minR,tag,now)\):
\(minL,minR\) 表示回溯前后的最小值。\(set\) 表示回溯到的值,\(tag\) 当前拥有的标记,\(now\) 表示当前的值。注意 \(minL,set\) 是相对于操作序列开始的增量,\(minR,tag,now\) 是相对于回溯到的值的增量。

若没有回溯操作则不记录 \(minL,set\) 即可。

record

标签:now,线段,杂烩,序列,区间,操作,维护,数据结构
From: https://www.cnblogs.com/watware-cym/p/17604986.html

相关文章

  • 接口相似数据结构复用率高?Apipost这招搞定!
    在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。为了解决这个问题,Apipost推出了数据模型板块。用户可以预先创建多个数据模型,并在API设计过......
  • 接口相似数据结构复用率高?Apipost这招搞定!
    在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。为了解决这个问题,Apipost推出了数据模型板块。用户可以预先创建多个数据模型,并在API设计......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......
  • 数据结构与算法
    链表链表跟数组关系密切,首先你要理解数组是一块连续的内存地址,把数据放进去。但是他有个不好就是不适合去做增删改查,进行移除或增加操作时,往往非常繁琐,相当于要改变整个数组,因此呢!链表就应用而生,给在存放每一个数据,同时给这个数据指向它后一个数据(链表分为指针域和数据域),且不在是储......
  • C语言数据结构学习资源
    我的代码仓库:efjN/DataStructure-码云-开源中国(gitee.com)学习方法:notion刷题模版:我的刷题记录https://beneficial-lyric-0ae.notion.site/leetcode-6b567423e5124303805770068f21692c?pvs=4学习网站:Hello算法(hello-algo.com)5星推荐代码随想录(programmercar......
  • 【C++数据结构】启航,打开新世界的大门!
    @TOC一、学习数据结构的原因学习数据结构对于计算机科学和软件开发非常重要,它提供了处理和组织数据的有效方法和技术。以下是几个学习数据结构的重要原因:提高问题解决能力:数据结构教会了我们如何选择和使用适当的数据结构来解决问题。了解各种数据结构的特性和性能可以帮助我们分......
  • C/C++ 数据结构五大核心算法之分治法
    分治法——见名思义,即分而治之,从而得到我们想要的最终结果。分治法的思想是将一个规模为N的问题分解为k个较小的子问题,这些子问题遵循的处理方式就是互相独立且与原问题相同。两部分组成:分(divide):递归解决较小的问题治(conquer):然后从子问题的解构建原问题的解三个步骤:1、......
  • 数据结构--排序
    什么是排序?排序:将无序序列排成一个有序序列的运算.排序的应用非常广泛.排序方法的分类按照储存介质分类.内部排序:数据量不大,数据在内存,无序内外存交换数据.外部排序:数据量较大,数据在外存(文件排序).按比较器个数分类串行排序:单处理机(同一时刻比较一对元素)......
  • 考研数据结构——每日一题[WPL]
    3766.二叉树的带权路径长度二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和,也就是每个叶结点的深度与权值之积的总和。给定一棵二叉树T,请你计算并输出它的WPL。注意,根节点的深度为0。样例输入:二叉树[8,12,2,null,null,6,4,null,null,null,nul......
  • freemeker 遍历map嵌套list数据结构
    遍历嵌套数据结构渲染map中value是list的内容<#ifnodes??&&(nodes?size>0)>【节点明细】<#listnodes?keysasalarmLevel>${alarmLevel+":"}<#if(nodes[alarmLevel])??><#list(nodes[alarmLevel])asnode>${node.nodeNo}<#sep>,&......