nlog

数据结构 — 堆

╄→гoц情女王★ 提交于 2020-05-05 13:04:50
目录 文章目录 目录 堆 堆的应用 堆的基本操作 往堆中插入元素 删除堆顶元素 堆的排序 参考文章 堆 堆可以是一个完全二叉树,这样实现的堆也被称为二叉堆。完全二叉树,它的叶子节点都在最后一层,并且这些叶子节点都是靠左排序的。 堆中节点的值都 >=(或 <=)其子节点的值,堆中如果节点的值都 >= 其子节点的值,我们把它称为大顶堆,如果都 <= 其子节点的值,我们将其称为小顶堆。 从堆的特点可知,下图中 1、2 是大顶堆,3 是小顶堆, 4 不是堆(不是完全二叉树)。 从上图也可以看到,一组数据如果表示成大顶堆或小顶堆,可以有不同的表示方式,因为它只要求节点值 >=(或 <=)子节点值,并未规定左右子节点的排列方式。 堆的底层是如何表示的呢,从以上堆的介绍中我们知道堆是一颗完全二叉树,而完全二叉树可以用数组表示: 如上图示,给完全二叉树按从上到下、从左到右编号,则对于任意一个节点来说,很容易得知如果它在数组中的位置为 i,则它的左右子节点在数组中的位置为 2i、2i + 1,通过这种方式可以定位到树中的每一个节点,从而串起整颗树。 一般对于二叉树来说每个节点是要存储左右子节点的指针,而由于完全二叉树的特点(叶子节点都在最后一层,并且这些叶子节点都是靠左排序的),用数组来表示它再合适不过,用数组来存储的好处在于不需要存指向左右节点的指针,在这颗树很大的情况下能省下很多空间。 堆的应用

浅谈FFT-快速傅里叶变换

天大地大妈咪最大 提交于 2020-05-05 11:58:49
学前须知: 作为一名 巨弱 的数学竞赛生&高数爱好者,数论知识无疑是我在oi最擅长的领域( 没有之一 )了。那么我来结合网上的现有资料,以及我的个人见解,书写一篇关于快速傅里叶变换的博客吧。 关于FFT我大约半年前掌握了,现有些许生疏,而且最近学了数学中有关拓扑学的DFT,有了些新的见解,所以写了这篇。 此博客的作用是为了让不会的同学快速入门学习,以及在我本人写的过程中提升自我,无任何商业目的。PS:本人原创意识薄弱可能会从网上找一些现有资料。 此博客重在为初学者提供技巧以及结论的运用,至于理由我会粗略介绍,我认为还是要先知其然,学到手后再考虑证明什么的吧 如果你实在看了还不会的话背板子就行了,不用太过纠结。还有关于关于第二板块的数学知识大家没学过的话跳过就行就是科普一下。 另外此篇是给有数学基础高中生已经自学了高中数学的同学看的。如果对虚数三角函数等知识不熟悉可以自行学习,此论文中不再赘述了。 1.FFT的作用以及功能 相信大家都曾听闻过FFT,它是一种可以优化高精度乘法的 高逼格 算法。 首先我们要知道FFT是由DFT以更高效,快速计算的方式得到的。在介绍FFT之前我会再讲一下关于DTF(离散傅里叶变换)的数学意义,这是其他的博客都不介绍的内容。为什么介绍呢,这是因为可以让你了解数学中离散傅里叶变换是如何把信号从时间域转到频率域的,正如我们的现在的计算机的DFT也是用的这种转换

算法的时间复杂度和空间复杂度

无人久伴 提交于 2020-05-04 23:41:23
最近在研究数据结构与算法,在B站中找到了小甲鱼的《数据结构与算法课程》,挺有意思的! (小甲鱼)数据结构和算法 对于一个算法来说,分析有两步,第一是从数学上证明算法的正确性,第二步是分析算法的时间复杂度。 算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能反映出算法的优劣与否。 度量一个程序的执行时间通常有两种方法。 一、事后统计的方法 该方法有两个缺陷: 1、要想对设计的算法的运行性能进行评测,必须先依据算法编制相应的程序并实际运行; 2、所得的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优势。 二、事前分析估算的方法 一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素: 算法采用的策略、方法; 编译产生的代码质量; 问题的输入规模; 机器执行行指定的速度; 一个算法是由控制结构(顺序、分支和循环)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度。 三、时间复杂度 1、时间频度 一个算法执行所消耗的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试 ,只需知道哪个算法花费的时间多

2019牛客暑期多校训练营(第三场)G:  Removing Stones(启发式分治)

大兔子大兔子 提交于 2020-05-02 11:52:14
题意: 给定N,表示N堆石子,每堆石子数为a[],问多少个区间,可以满足“石子总和若为偶数,那么可以两两取来自不同堆的石子,直到取完; 如果为奇数,那么排除其中一个,然后可以两两取来自不同堆的石子,直到取完”。 思路: 结论是,如果一个区间的区间和大于等于区间最大值的两倍,则这个区间合法。 考虑分治,我们首先找到区间最大值(为了不重复统计,多个最大值时,统一取最左边的,这个可以ST表示实现),然后考虑跨越这个位置的合法区间个数。枚举一端,另外一段二分即可。 由于分治的性质,我们每次的复杂度要倾向于小的那边,即是一个启发式合并的逆过程,所以启发式分治复杂度是O(NlogN)的,加上二分,这个做法的复杂度是O(Nlog^2N)。 可以参考差不多的题: https://www.cnblogs.com/hua-dong/p/11171241.html 。所以我感觉我遇到的原题还挺多的。 #include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn= 300010 ; int lg[maxn],a[maxn],dp[maxn][ 20 ],N; ll sum[maxn],sum2[maxn],ans; void

Make Rounddog Happy(2019年杭电多校第十场1011+HDU6701+启发式分治)

帅比萌擦擦* 提交于 2020-05-02 11:51:37
[TOC] 题目链接 传送门 题意 求有多少个子区间满足$a_l,a_{l+1},\dots,a_r$均不相同且$max(a_l,a_{l+1},\dots,a_r)-(r-l+1)\leq K$。 思路 听说是启发式分治然后就去学了下如何套板子,赛场上写搓了本地过不了样例,赛后改过来了。 启发式分治在本题的思路貌似就是在处理$[l,r]$时找到区间最大值的位置$mid$,然后看左半部分区间长度短还是右半部分短,然后暴力统计短的那部分的贡献。 首先预处理出以$i$为左端点,区间内没有相同数的右端点$R[i]$和以$i$为右端点,区间内没有相同数的左端点$L[i]$,再用$st$表处理出区间最大值的位置。 在分治时由于我们已知最大值位置在哪,然后算贡献时(拿左半部分为例子)枚举不等式中的$l$,然后移项计算出满足题意的最近右端点$r\geq a[mid]-K+l-1$,然后用以$l$为左端点区间内没有相同数的右端点$R[l]$(满足题意的最远右端点)来减去这个值就是这个左端点的贡献,复杂度为$O(nlog(n))$。 代码 #include <set> #include <map> #include <deque> #include <queue> #include <stack> #include <cmath> #include <ctime> #include <bitset>

【大道至简】NetCore3.1快速开发框架一:集成Swagger

≡放荡痞女 提交于 2020-05-02 08:28:04
在上一章节中,我们创建了基本的框架结构: https://www.cnblogs.com/fuyu-blog/p/12217647.html 下面我们测试接口和集成Swagger接口文档 一、接口测试 在默认创建的API中,大大和2.2不一样的是给了一个默认的接口示例,但不是Values了,变成了一个天气预报,【为什么呢~~~】 好吧,不管是Values还是天气预报,只要能运行起来,就是好大大 在Api项目右击,点击选择运行,或者在工具栏,点击运行-启动而不调试 自动会打开浏览器,运行成功 下一步,我们自己新建的接口测试一下 在API项目中,Controller文件夹,右击新建文件 选择ASP.NET Core ——Web Api控制器类,输入一个自己写的名字,点击新建按钮 这样一个简单的接口测试类就生成了 生成项目F6 输入测试地址: https://localhost:5001/api/values 访问成功 二、集成Swagger接口文档 在FytSoa.Api项目右击依赖项中,选择管理nuget包,并搜索Swashbuckle.AspNetCore包添加至引用 添加成功 在 Startup 类中 添加并配置 Swagger 中间件 public void ConfigureServices(IServiceCollection services) { services

Discrete Cosine Transform

我只是一个虾纸丫 提交于 2020-05-02 05:54:04
离散余弦变换 由于实信号傅立叶变换的共轭对称性,导致 DFT后在频域中有一半的数据冗余。 离散余弦变换(DCT)在处理实信号时比离散傅立叶(DFT)变换更具优势。在处理声音信号这类实信号时,DFT得到的结果是复功率谱,其结果中的一半数据是没利用价值的。相比之下,DCT得到的结果是实谱,从而节省了不必要的运算。 一个序列的DFT就是将其周期拓展后取其DFS系数的一个周期。如果序列的开始及结尾处的幅值差异较大,那么这个周期拓展的序列便会有较多的高频分量。 而序列的DCT(实序列)相当于一个长度是它两倍的实偶序列的DFT(普通序列的DFT=实序列+虚序列),在储存同样个数的数据的情况下,DCT的能量更集中在低频。 DCT还有一个很重要的性质(能量集中特性):大多书自然信号(声音、图像)的能量都集中在离散余弦变换后的低频部分,因而 DCT在(声音、图像)数据压缩中得到了广泛的使用。由于 DCT是从 DFT推导出来的另一种变换,因此许多 DFT的属性在 DCT中仍然是保留下来的。(归一化之后,会在高频产生很多0系数,说明DCT比FFT变换具有更好的能量聚集度。) DCT在图像处理中优于DFT的性质是更高的能量聚集度,根本原因是二维DCT和二维DFT变换空间的基底不同。二维DFT的变换空间基底(谐平面波分量)是由sin和cos平面波共同构成的。而二维DCT的变换空间基底(谐平面波分量

SDOI2018 一轮培训划水祭

≡放荡痞女 提交于 2020-05-01 23:24:15
#$\mathcal{Day \ \ -3}$ 作为前言来讲,我对于过几天的省选培训还是很期待的……就算我的实力根本不够,名额是学校推荐的,但是能见到$\mathcal{cwbc}$以及一众大佬,也是很够的了,至于听懂多少emmm再说吧(逃 虽然还不知道到底课上讲什么,不过问了问$rqy$,他是这么描述的: ###“这个培训就是认为你什么都会了,然后开始讲题和各种技巧。” 好像$\mathcal{starfish}$?不过话说我对于力量一无所知省选以上的知识,只限于……线段树?Splay?剩下的好像就不大会了QAQ……(如果口胡的也算的话,那么应该还会有什么莫比乌斯反演、狄利克雷卷积、主席树、树链剖分、网络路之类的QAQ)……但是我觉得好像够了【$Flag \ \ Warning$ 嗯,立个$flag$起码听懂百分之二十! #$\mathcal{Day \ \ 0}$ 今天下午去了培训地点……离我家挺近的……三四公里吧,在一座荒山雄伟的山上(“雄伟” means that “爬上去很费劲”),不过上机环境不知道比NOIp和qbxt高明到哪里去了,感觉十分的$\mathcal{starfish}$!! 嗯……发了营服,上面写着山东队……真是羞耻啊(虽然好像可以装一波QAQ),加油吧bvb! #$\mathcal{Day \ \ 1}$ 真是天道好轮回,苍天饶过谁啊!(大雾

「总结」多项式生成函数相关(3)

ぐ巨炮叔叔 提交于 2020-05-01 23:16:13
今天是生成函数了。 。。。 是我学的最难的多项式部分了。 其实我也可以说是现学现卖,学的不好讲的不好大家见谅。 我之前讲的大部分东西都可以和生成函数相结合。 生成函数分成三种。 我们一个一个来。 1.普通型生成函数($OGF$) 对于一个已知的数列${a_i}$。 其$OGF$为: $$F(x)=\sum\limits_{i=0}^{\infty}a_ix^i$$ 例如:${1}$的$OGF$就是: $$F(x)=\sum\limits_{i=0}^{\infty}x^i=\frac{1}{1-x}$$ 很多时候我们用生成函数的原因是,我们可以把一个数列转化成一个简单的形式。 例如$\frac{1}{1-x}$ 如果我们让两个$OGF$相乘会怎么样呢? 简单的例子: 比如说如果我们可以选两个物品,分别从两组中选择。 第一组物品的体积和每种体积的物品种类用数列${a_i}$来表示。 第二组物品的体积和每种体积的物品种类用数列${b_i}$来表示。 设${a_i}$的$OGF$为$A(x)$,${b_i}$的$OGF$为$B(x)$ 那么$(A(x)B(x))_i$就是选择的两个物品的体积和为$i$的方案数。 $OGF$经常来解决这种组合问题。 例: http://hzoj.com/contest/126/problem/5 裸的容斥题,我们将数列换成生成函数。 设一个的$OGF$为

CSP AFO后可以公开的情报

无人久伴 提交于 2020-05-01 14:36:26
10.08 早上和下午准备初赛,晚上考了套题,然后就摸文化课去了。 $250/250$ 手动模拟确实效果好   经验是把双刃剑,读题细致才是王道   T3是分治,一看到1e5的数据就习惯性往数据结构想,一看到XOR就想trie,太无知的我 解锁新bug: int a[i]...; 10.09 复习了一天文化课 10.10 月考螺旋丸了 10.11 填坑一天 晚上考试挖坑 $100/120$ 好吧这次考试因聚众颓废特殊原因受了影响,但还是挂了20分,T2从$nlog^{2}_{n}$一步步到$n$的过程挺爽的 10.12 月考真的炸了,也是意料之中。   整理了资料,练一套题 10.13 早上考试$(20/20)$,菜是原罪   晚上换心,效率高了 10.15 被魏老大要求进冬令营,蒟蒻的我瑟瑟发抖 10.16 复习了二分倍增尺取等技巧,发现自己多么弱小,晚上睡着了。。。 10.17 本打算复习数论,弃,遇任学长: “联赛只用学$exgcd$和拉格朗日差值就好” $tythen$推荐福建省夏令营,刷了下还行(我竟然说普及难度的题还行QAQ) 10.18 状态不佳,晚上很颓 10.19 早上初赛真刺激   晚上对答案更刺激 10.21 早上考试有约瑟夫,以前背的$n^2$,所以当考$nlogn$时我沉默了。这是血的教训,让我铭记 男人定要最求更快!   彻底停课了,菜,也只能上了 10