![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Star_.
这个作者很懒,什么都没留下…
展开
-
P1908 逆序对
写给自己复习看,归并排序下,将数组每次都从中间分开,直到分的数组里只有1个元素,接下里是并,现在依次对比分开的数组元素大小,(借用下大佬的图片)然后左边的元素比右边的大,就交换位置,归并到上一个层级之后继续归并,直至数组归并到n。分治,正好练一练,没想到把归并排序也复习了一下,确实有点忘记了。这题是归并排序的应用,也可以用树状数组来做。原创 2022-09-25 15:12:00 · 160 阅读 · 0 评论 -
合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。哈哈,复习递归和数据结构/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int v原创 2022-02-12 11:33:41 · 222 阅读 · 0 评论 -
删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。题不难,但是很一种递归的方法很巧妙首先,看下我又臭又长的代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(原创 2022-02-10 11:37:06 · 167 阅读 · 0 评论 -
链式前向星
链式前向星就是邻接表的数组存储方式链式前向星的构造#include<bits/stdc++.h>using namespace std;int n,m,s,u,v,w,cnt,head[100005];struct Edge{ int to,dis,next;}edge[2000005];void Add_edge(int from,int to,int w){ edge[++cnt].to=to; edge[cnt].dis=w; edge[cnt原创 2021-11-27 22:33:31 · 233 阅读 · 0 评论 -
树状数组简述
树状数组是利用二进制的特点进行检索的树状结构。就像前缀和,一个数组里包含多个数之和,树状数组也就有这样的性质对于每个数组的元素他的值到底等于哪些元素的和。是利用了二进制数的性质将数字转化成二进制数,最末尾的一之后哪些数转化成十进制就是代表他由几个数组成。从他这个数本身开始往前。也就是说c[i]必定包括a[i]。那我们是通过一个lowbit函数来找到这个末尾最后一个1的int lowbit(int x){return x&-x;}树状数组求前n项的和int sum(int i)原创 2021-10-09 14:40:21 · 81 阅读 · 0 评论 -
Treap树
简述:Treap=Tree+Heap。Treap树也是一个二叉搜索树,但是他多了一个键值key,这些优先级是是在结点插入时,随机赋予的,Treap根据这些优先级满足堆的性质。要满足堆的性质,treap树则构造了一个旋转函树。对于treap树,基本的操作有:结点的定义,插入,旋转,找第k大的数,查询某个数结点的定义:struct node{ int rank;//优先级 int key;//键值 int size;//这个结点为根结点时的子树的结点总数(用于名次数) n原创 2021-10-09 13:59:18 · 167 阅读 · 0 评论 -
线段树简述
线段树概念:线段树是一种二叉搜索树,其存储的是一个区间的信息,用[L,R]表示从L到R之间存在的信息。线段树的延迟更新:在结构体中再定义一个对象 lazy,add记录的是此节点所代表的区间所有数被加的值,在我们进行操作时,比如加减,我们就可以利用lazy然后往下修改,而不用修改一次就遍历一次,大大节约时间。线段树的基本操作:建树、单点查询、单点修改、区间查询、区间修改结点的构建:const int maxn=1e6;struct node{int l, r,lazy,val;}tr原创 2021-10-02 22:58:57 · 94 阅读 · 0 评论