nlog

堆排序(大顶堆、小顶堆)----C语言

▼魔方 西西 提交于 2020-08-15 21:55:03
堆排序 之前的随笔写了栈( 顺序栈 、 链式栈 )、队列( 循环队列 、 链式队列 )、 链表 、 二叉树 ,这次随笔来写堆 1、什么是堆? 堆是一种 非线性结构 ,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲 堆其实就是利用完全二叉树的结构来维护的一维数组 按照堆的特点可以把堆分为 大顶堆 和 小顶堆 大顶堆:每个结点的值都 大于 或 等于 其左右孩子结点的值 小顶堆:每个结点的值都 小于 或 等于 其左右孩子结点的值 ( 堆的这种特性非常的有用,堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素 ) 2、堆的特点(数组实现) (图片来源:https://www.cnblogs.com/chengxiao/p/6129630.html) 我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 (图片来源:https://www.cnblogs.com/chengxiao/p/6129630.html) 我们用简单的公式来描述一下堆的定义就是:(读者可以对照上图的数组来理解下面两个公式) 大顶堆: arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆: arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 3、堆和普通树的区别 内存占用

数据结构水题选讲

落爺英雄遲暮 提交于 2020-08-15 07:46:45
[Ynoi2011]ODT \(O(nlog^2n)\) 的做法非常显然 直接把树重链剖分一下,每个点维护轻儿子的平衡树就行 但是这题 \(1e6\) 的数据范围使得 \(O(nlog^2n)\) 没那么容易卡过去(当然很多人卡过去了 考虑给一个点很多重儿子 那么若一个点有 \(k\) 个重儿子,修改复杂度就变成 \(O(log_knlog_2n)\) ,而查询复杂度变成 \(O(klog_2n)\) 了 为了均摊我们需要 \(log_kn=k\rightarrow k^k=n\) ,发现当 \(k=7\) 时应该是最优的 这样我们得到了一个复杂度 \(O(7nlogn)\) 的算法,已经足够通过这道题了 好像还有一个 \(log\) 的做法但是我不会也找不到讲解先咕了 [Ynoi2019]魔法少女网站 Ynoi+序列=分块 考虑把操作分块 把所有询问按照x从小到大排序,对于当前的x,把小于等于他的位置设为1,大于的位置设为0,每次x变大就把新符合的变成1 用类似链表的东西维护一下 由于需要查询区间我们考虑分块维护(因为我们需要 \(O(1)\) 插入,现在唯一的问题就是修改操作中会把1变成0 考虑一个套路就是插入之后按序撤销,初始让所有被修改的位置一直是0就行了 复杂度 \(O(n\sqrt{n})\) [Ynoi2017]由乃的玉米田 前两个操作可以显然的用莫队+bitset做

堆排序(大顶堆、小顶堆)----C语言

依然范特西╮ 提交于 2020-08-15 07:16:17
堆排序 之前的随笔写了栈( 顺序栈 、 链式栈 )、队列( 循环队列 、 链式队列 )、 链表 、 二叉树 ,这次随笔来写堆 1、什么是堆? 堆是一种 非线性结构 ,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲 堆其实就是利用完全二叉树的结构来维护的一维数组 按照堆的特点可以把堆分为 大顶堆 和 小顶堆 大顶堆:每个结点的值都 大于 或 等于 其左右孩子结点的值 小顶堆:每个结点的值都 小于 或 等于 其左右孩子结点的值 ( 堆的这种特性非常的有用,堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素 ) 2、堆的特点(数组实现) (图片来源:https://www.cnblogs.com/chengxiao/p/6129630.html) 我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 (图片来源:https://www.cnblogs.com/chengxiao/p/6129630.html) 我们用简单的公式来描述一下堆的定义就是:(读者可以对照上图的数组来理解下面两个公式) 大顶堆: arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆: arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 3、堆和普通树的区别 内存占用

Java实现八大排序算法

喜你入骨 提交于 2020-08-14 08:06:51
本文对常见的排序算法进行了总结。 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: \[\begin{cases}内部排序 \begin{cases}插入排序\begin{cases}直接插入排序\\希尔排序\end{cases}\\选择排序\begin{cases}简单选择排序\\堆排序\end{cases}\\交换排序\begin{cases}冒泡排序\\快速排序 \end{cases}\\归并排序\\ 基数排序\end{cases}\\外部排序 \end{cases} \] \[\left\{\begin{matrix} 内部排序\\ 外部排序 \end{matrix}\right. \] 稳定与非稳定 : 如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是 稳定 的。反之,则是 非稳定 的。 直接插入排序 基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了要给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序

[考试反思]0520省选模拟101:目的

大城市里の小女人 提交于 2020-08-14 06:45:10
没得说。怎么这么菜啊。 $T1$的$60$分白送的基本都不用想。 (诶那我这场考试干啥了? $T2$看着像个$min25$筛的板子。就是数据范围大了点 然而因为几乎没怎么遇到过$min25$的题,只写过一次而且还是三个月前了。 所以基本上是忘的一干二净考场上一点一点尝试想的。 结果写的混天黑地终于写完,过掉样例,就交了。 十分快乐的是:少取了个模。直接爆零。然后这场就没了。 就当是练习不熟练的知识点了(自己都不信。。。 我到现在都不知道我这么做的目的是什么。但愿不要再考场弱智了(事实上明天还是这样 T1:石子游戏 大意:$nim$。问去掉最少几堆石子后可以先手必胜。$n \le 5 \times 10^5,A \le 5 \times 10^5$ 要求出最少用多少个堆能得到和所有石子堆一样的异或值。 删掉的石子堆数是$logA$级别。否则线性基可以表出就可以去掉了。 所以暴力做$dp$是$O(n^2)$的。每一轮用$xorFWT$优化可以做到$O(nlog^2n)$。用$FWT$本质求单点点值可以做到$O(nlogn)$ 1 #include<cstdio> 2 #define S 1<<19 3 int a[S],n,t[S],T,ans; 4 void FWT( int *a){ for ( int i= 1 ;i<S;i<<= 1 ) for ( int j= 0 ;j<S

ASP.NET Core搭建多层网站架构【5-网站数据库实体设计及映射配置】

|▌冷眼眸甩不掉的悲伤 提交于 2020-08-13 14:06:55
2020/01/29, ASP.NET Core 3.1, VS2019, EntityFrameworkCore 3.1.1, Microsoft.Extensions.Logging.Console 3.1.1, Microsoft.Extensions.Logging.Debug 3.1.1 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构【5-网站数据库实体设计及映射配置】 网站数据库实体设计,使用EntityFrameworkCore 3.1 FluentAPI映射配置实体,网站启动时创建数据库并添加种子数据,开发调试时可以看到执行的具体sql语句 文章目录 此分支项目代码 本章节介绍后台管理的网站数据库实体设计,使用FluentAPI方式配置数据库字段映射,网站启动时创建数据库并添加种子数据 需求分析 首先要实现的功能有用户登录、角色管理、日志记录 大概有四张表:用户表、密码表、角色表、日志表 日志表: 用户表: 密码表: 角色表: 好像博客园md不支持表格功能?所以只能截图展示,excel表格上传至项目docs文件夹中 字段设计说明 日志表主键Id是数据库自增的,也就是在向数据库插入日志时,不用管Id,往里写入就行 用户表、角色表的Id都是long类型的,也就是使用雪花算法生成的Id 密码表的主键是Account,UserId是用户表外键

SXOI2020游记

大兔子大兔子 提交于 2020-08-13 11:22:25
坐标山西,A卷 day0 颓,不知道复习啥 去看了考场,环境蛮好的 ( 比去年在某附中考试的环境不知道高到哪里去了 ) 某 Zishu_jun 猜了一堆考点(提到了斯特林) day1 T1题面好长,看得一脸懵比,丢下就去康T2 T2随手推了几下,用了下斯特林数, \(??? O(m^2),过了???\) 飞速写完,然后又挂了个对拍,发现才过了半个小时??? T1想到三分加树状数组,然后又发现可以二分,于是 \(O(nlog^2n)\) 结果由于最开始想到的是三分,于是思维跑偏了QAQ,疯狂找单调性,找了2个多小时,自闭了,挂个对拍,60分再见 T3胡乱写了个暴搜,加了点剪枝,15分滚了(完全没思路啊啊啊) (发现自己实际码题+思考时间只有1个多小时...) \(=\) (发现自己不知道在干啥时间有3个多小时...) 于是day1: 60+100+15=175 day2 T1康数据范围发现应该是 \(O(m2^m)\) 暴力是枚举排列,那么就可以用装压来压缩排列的状态,用DP代替枚举 发现代价可以看成n-1个二元组,且两种情况的代价都可以分别拆到两个数上 那么就可以 \(O(m^22^m)\) 了 然后发现只要简单预处理复杂度就对了,但发现预处理数组看不下 于是把预处理的装压状态拆成两半分别整就行了 T2发现其实是要将tire树实现全局加1 回想了一下发现是原来考试题的小trick

CQOI2020省选记

主宰稳场 提交于 2020-08-13 03:03:41
CQ省选记 我可能是唯一一个三年OI蒟蒻 苟进CQ省队 还没有写过一篇博客的人吧 Day -24 5.26知道具体省选时间 第二天就停课了 当时什么水平呢 平衡树费用流fft都不会打 虚树 分块 多项式 数论 不知道 停课之后被两个机房大佬带动努力补坑 我属实也没想到 一个月效率能这么高 练了两周的套题 机房三个人 我每一次都是第三名(而且感觉实至名归 这段时间压力挺大的 但进步了很多 像是一个从0变成1的过程 然后一个月的时间 说过就过了 Day 0 到八中去试机的时候 遇到一个八中搞信竞的帅哥 呜呜呜眼睛好大好帅 不知道那个哥哥是高一还是高二的 国赛能见到吗 ( 雾 回来 试机的时候第一次用VW ( 感谢虚拟机day2给了我命 现场背了怎么写对拍 之前还不会dev开无限栈和O2 也现学现卖了一下 Day 1 早上发现二麻子(我家猫)在我房间拉了屎 气死了 T1 nlog^2好想好写 一个log的想到了 但是已经开始很久了 就拿了暴力分走人 T2 其实斯特林数拆完随便做 不是我说的 T3 代码17kb的打表 期望得分未知 Day 2 没想过要打正解 每道题都拿了多多少少的暴力分 然后撤了 还有个事就是我旁边的旁边坐的是大佬jly 他tql hd省选挂了 先回去准备期末了 但我们还有一年 我们也只有一年了 和其他竞赛强校比 附中还是逊色了 当时教练说有学校停课几个月几个月的停

[考试反思]0520省选模拟101:目的

匆匆过客 提交于 2020-08-13 02:21:59
没得说。怎么这么菜啊。 $T1$的$60$分白送的基本都不用想。 (诶那我这场考试干啥了? $T2$看着像个$min25$筛的板子。就是数据范围大了点 然而因为几乎没怎么遇到过$min25$的题,只写过一次而且还是三个月前了。 所以基本上是忘的一干二净考场上一点一点尝试想的。 结果写的混天黑地终于写完,过掉样例,就交了。 十分快乐的是:少取了个模。直接爆零。然后这场就没了。 就当是练习不熟练的知识点了(自己都不信。。。 我到现在都不知道我这么做的目的是什么。但愿不要再考场弱智了(事实上明天还是这样 T1:石子游戏 大意:$nim$。问去掉最少几堆石子后可以先手必胜。$n \le 5 \times 10^5,A \le 5 \times 10^5$ 要求出最少用多少个堆能得到和所有石子堆一样的异或值。 删掉的石子堆数是$logA$级别。否则线性基可以表出就可以去掉了。 所以暴力做$dp$是$O(n^2)$的。每一轮用$xorFWT$优化可以做到$O(nlog^2n)$。用$FWT$本质求单点点值可以做到$O(nlogn)$ 1 #include<cstdio> 2 #define S 1<<19 3 int a[S],n,t[S],T,ans; 4 void FWT( int *a){ for ( int i= 1 ;i<S;i<<= 1 ) for ( int j= 0 ;j<S

第一类斯特林数

怎甘沉沦 提交于 2020-08-13 01:44:08
两类斯特林数的其中之一 还是要了解一下的。 一般形如 \(\left[\begin{matrix}n\\m\end{matrix}\right]\) 写作 \(s(n,k)\) 组合意义: \(s(n,k)\) 表示把n个数分成k组 每组是一个环 求分成的方案数。 环的意思其实是类似于圆排列的东西。 递推式: \(s(n+1,k)=s(n,k-1)+s(n,k)\cdot n\) 有边界 \(s(0,0)=1\) . 性质: \(s(n,1)=(n-1)!\) 这个看起来挺显然不正了 当然可以相当于圆排列来理解。 \(s(n,2)=(n-1)!\times\sum_{i=1}^{n-1}\frac{1}{i}\) 这个利用数学归纳法也很好证。 \(\sum\limits_{i=0}^ns(n,k)=n!\) 证明:求n个数的所有排列方案数n! 对于某种排列其中必然有k个置换 而置换就是我们上述所说的环的概念。 对于有k个置换的方案数 其为s(n,k)所以可以得到 \(\sum\limits_{i=1}^ns(n,k)=n!\) 因为s(n,0)=0所以原式成立。 这里先规定一下上升幂和下降幂。 定义下降幂为 \(x^{\underline{n}} = x(x-1)\cdots (x-n+1).\) 上升幂为 \(x^{\overline{n}} = x(x+1)\cdots (x