首页 > 其他分享 >Uoj228 基础数据结构练习题

Uoj228 基础数据结构练习题

时间:2023-03-06 11:55:45浏览次数:56  
标签:练习题 势能 开根 log Uoj228 Phi sqrt 区间 数据结构

Uoj228

最开始好像是在那个区间加区间 \(\text{popcount}\) 的题里看到有人提到这个题,就来写下。

离联合省选还有 26 天,发了一上午呆。


题意 区间加 区间开根 区间和 \(n,m\leq10^5\),1s 256mb

遇到区间开根这种显然无法整体打 Tag 的东西,一般考虑势能分析。

如果你做过这个题没有区间加的弱化版的话,考虑一个数开根 \(\log \log n\) 次就会变成 \(1\), 如果没有区间加的话,就维护一下区间里有没非 \(1\) 的数暴力开根就行了。

有这个区间加的话,简单分析一下可以发现:对于两个差很大的数,复合若干次 \(f(x)=\sqrt{x+a}\) 后差会变得很小,进一步地,对于两个数 \(a,b\),\(\sqrt a-\sqrt b\leq \sqrt {a-b}\) 给式子两边平方一下可以简单地发现。也就是说差大于 \(1\) 的两个数会在若干次复合后变成差为 \(1\) 的,再变成 \(0\),其中有一种特殊情况就算 \(b-a = 1,b = z^2 ,z\in Z\) 操作后差仍然为 \(1\)。

也就是说对于两个同一个段里不同的数。即使有区间加,我们最多给他们各自开根 \(O(\log\log n) = 4\) 次后差就会变成 \(1\)。

然后这个问题就变的清晰起来了,考虑分块:

如果一个块不满足所有数相同或开根后极差仍然为 \(1\),就暴力开根,否则打标记处理和的变化。

考察每个块的极差作为势能,\(\Phi(s)\) 表示状态 \(s\) 时的势能,令 \(\Phi(s)=\sum_p\log \log ( \max(p)-\min(p) )\),我们每暴力进行一次根号级别的暴力开根,新状态的势能至少减少 \(1\),即 \(\Phi(s')\leq\Phi(s) -1\),每次区间加或区间开根显然只会给边上的 \(O(1)\) 块带来 \(O(\log \log n)\) 所以时间复杂度是均摊 \(O(n\sqrt n\log\log n)\) 的,可以摊成 \(O(n\sqrt {n\log\log n})\) 但是更慢了,反正都不卡常随便过。

在 gjh 的提醒下,(并不是那么 ) 容易发现,因为区间操作的性质,上面那个分块的势能分析拿到 SegmentTreeBeats 上也是成立的,所以可以做到 \(O(n\log n\log\log n)\) 还更好写 [小丑]。

标签:练习题,势能,开根,log,Uoj228,Phi,sqrt,区间,数据结构
From: https://www.cnblogs.com/Dreamerkk/p/17183211.html

相关文章

  • C#实现类似Lua的table的数据结构
    设计意义Lua的table是使用键值对的方式存取,在CSharp中对应的是字典。但是字典会判断键存在与否,而且使用Add和Remove方法来实现存取改,长期来说确实不方便,使代码看上去不是......
  • 常用数据结构和算法总结
    线性表:单链表双向链表循环链表栈队列递归字符串数组树二叉树哈夫曼树:又称为最优树,是一种带权路径长度最短的树平很二叉树B树......
  • 剑指Offer36 -- 数据结构
    1.题目描述二叉搜索树与双向链表2.思路3.代码......
  • C/C++ 数据结构堆结构算法的实现
    #include<stdio.h>#include<stdlib.h>#include<string.h>//堆的算法实现#defineDEFAULT_CAPCITY128typedefstruct_Heap{int*arr;//存储堆元素的数组......
  • C/C++ 数据结构优先级队列的实现(使用二级指针)
    #include<iostream>#include<Windows.h>#include<iomanip>//优先级队列的实现usingnamespacestd;#defineMaxSize5typedefintDataType;//队列中的元素类型......
  • 给闺女写了一个99乘法除法练习题
    #99乘法练习importrandomimporttimenum=0start=time.time()forxinrange(10):a=random.randint(1,9)b=random.randint(1,9)print('请小余同......
  • 数据结构1.2
    一、简述本节介绍一下单调队列及其一些应用。二、单调队列单调队列就是队列元素满足单调性的一类数据结构,主要用于解决滑动窗口类的问题,即维护一个区间的最值,在应用时时......
  • C/C++ 数据结构使用数组实现队列的基本操作
    //使用数组实现队列#include<iostream>#include<Windows.h>usingnamespacestd;#defineMAXSIZE5//队列的最大容量typedefintDataType;//队列中的元素类型......
  • 两数之和 II - 输入有序数组(数据结构和算法两种实现方式)
    题目:给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[ind......
  • 数据结构1.1
    一、简述本节介绍一下单调栈以及单调栈的一些应用。二、单调栈所谓单调栈,就是具有存储的元素呈现某种单调性的栈。比如:从栈底元素到栈顶元素是单调递减的,就是一个单调......