- 博客(21)
- 收藏
- 关注
原创 求序列中逆序数的四大算法(倾心之作)(2024年851真题就是考了归并排序求逆序数(>—<))
通过归并排序、树状数组、线段树、trie数的基本原理,来快速求解一个序列中的逆序数。
2023-05-15 00:52:19
9590
4
原创 有关前缀和知识的总结
前缀和顾名思义就是求一个序列的前缀之和,它能够在O(1)的时间复杂度内求得区间的值。前缀和的最基本用法:典型例题E. Yonagi and YOASOBI#include<bits/stdc++.h>using namespace std;const long long N=1e6+7;struct node{ long long a; long long ah; long long ahh;}b[N];char c[N];int main(){ cin>
2022-04-24 17:04:26
470
原创 差分数组(简单易懂)
一、什么是差分数组?差分数组本质上来说就是一个数组,可以用O(1)的时间处理区间修改。二、差分数组的定义式设原数组为a数组,差分数组为d数组,则对于i∈[2,n],都有d[i]=a[i]-a[i-1].三、差分数组的性质1.当我们需要更新区间[l,r]时候(仅指加减运算),我们仅仅可以只更新d[l]+=x,d[r+1]-=x;2.当我们需要单独查询原数组一个点的值的时候,我们不难发现出令Sn为di的前缀和,那么a[i]=Si;3.当我们需要求原数组的前缀和的时候,我们可以设前x项
2022-04-24 00:21:46
10031
8
原创 线段树模板(史上最简单易懂的数据结构)
什么是线段树?线段树言下之意就是将线段分解为一颗树,并且这颗树是一颗二叉树,树上的每一个节点都具有某些性质。线段树有什么用?线段树主要能够在O(logn)的时间复杂度上解决区间上的问题。题目引入:AcWing243.一个简单的整数问题2本题目就是很简单的线段树的板子题,可以用来当做模板来使用。线段树的几个重要操作:1.tree[]数组的建立:struct node{ int l;//表示左端点 int r;//表示右端点 int v;//表示区间内的...
2022-04-19 20:29:41
3376
1
原创 最近公共祖先(LCA)之倍增法
什么是最近公共祖先?LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先--------百度百科例如:对于点9和点5,它们的最近公共祖先是点2;对于点4和点2,它们的最近公共祖先是点2。这里答案是显而易见,但是如果我们需要用暴力来计算的话,对于n个点,m次询问,时间复杂度为O(nm),显然,当n和m过大的时候就TLE了,所以,我们需要一种更好的算法来降低时间复杂度,接下来的倍增法就是其中一种方法。首先定..
2022-04-15 21:37:06
805
1
原创 Codeforces Round #768 (Div. 2) A~C题解
Problem A:本题大意为存在两个长度相等的数组a、b,任意选择索引i,交换数组ai,bi的值,使得a数组的最大值乘以b数组的最大值最小。本题不难想到我们可以遍历数组,依次将比较大的放到a数组内,否则放到b数组内。AC代码:#include<bits/stdc++.h>using namespace std;int a[1000001];int b[1000001];int main(){ int t; cin>>t; while
2022-01-28 14:36:28
1265
1
原创 Educational Codeforces Round 121 [Rated for Div. 2]A~C题解
A题:本题目大意为输出一个字符串,其字符串的每一个相同字符的距离为定值,输出任意一种情况即可。做题的时候可以直接统计字符串的个数,并统一一起输出。题目较简单,具体代码如下:...
2022-01-17 14:20:15
538
原创 筛素数(常见易懂版)
所谓的素数(质数),就是该数只能被1和他本身整除的数。所以,我们可以这么写:#include<bits/stdc++.h>using namespace std;
2021-12-24 20:57:46
678
原创 康拓展开即逆康拓展开(简单易懂版)
康拓展开当我们去搜康托展开这个关键字的时候,映入眼帘的是下面的一大堆公式:其中X为康拓展开值为整数,且且表示袁数在当前未出现的元素是排第几个。很不错,这样一下子会把人弄得搞陀不清(湖南方言)。所以,当我们学习一个算法的时候,首当其冲的应该是要知道此算法到底是做什么用的?百度百科是这样解释的:康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。这是什么意思呢?简单的来说就是将一个
2021-12-22 15:04:51
1629
2
原创 树状数组(树状数组的基本用法与操作)
什么是树状数组?树状数组简单的来说就是将一个数组模拟树形结构。树状数组有什么用?树状数组可以将求和的从O(n)操作简化为O(logn)。如图所示,横线下方为a数组表示为初试数据;上方为数组c,利用树形结构存储a数组内的数据。我们列举出来的这些:c[1]=a[1]c[2]=a[1]+a[2]c[3]=a[3]c[4]=a[1]+a[2]+a[3]+a[4]c[5]=a[5]c[6]=a[5]+a[6]c[7]=a[7]c[8]=a[1]+a[2]+a[3]+a[4]
2021-11-14 21:36:26
2265
2
原创 快速排序交换法------2
嗯...本人在【模板】快速排序 - 洛谷题上看到大佬的题解。觉得我之前写的好像很复杂。代码:#include<iostream>using namespace std;int n,a[1000001];void qsort(int l,int r)//应用二分思想{ int mid=a[(l+r)/2];//中间数 int i=l,j=r; do{ while(a[i]<mid) i++;//查找左半部分比中间数大的数
2021-10-30 17:25:54
171
原创 快速排序挖坑法
快速排序是一种高效的排序算法,不管是考研还是公司面试,快速排序算法都是我们必不可少的知识点。本解析为快速排序的挖坑法(快排还有交换法)。快速排序的挖坑法是快速排序的原理的实现。具体的步骤:设定一个基准值(一般为序列的最左边元素,也可以是最右变的元素)此时最左边的是一个坑。 开辟两个指针,分别指向序列的头结点和尾结点(选取的基准值在左边,则先从右边出发。反之,选取的基准值在右边,则先从左边出发)。 从右指针出发依次遍历序列,如果找到一个值比所选的基准值要小,则将此指针所指的值放在坑里,左指
2021-10-30 15:50:40
1296
3
原创 快速排序交换法------1
快速排序简称“快排”。在C++STL模板库内有快排的函数sort();这就阻挡住我们更深入理解快排。快排不管是各个公司的面试,还是考研,都是必考的知识点。快排其实很简单,接下来我们了解一下快排:快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序算法通过多次比较和交换来实现排序,具体步骤如下:注明:本解析的主要方法为交换法。还有一种方法为挖坑法。开辟两个指针,分别指向序列的头节点i,序列的尾节点j。 设定一个分界值(一般为该序列的第一个元素),通过该分界值将数组分成左右两部分。
2021-10-26 16:07:10
860
原创 插入排序及希尔排序
插入排序:插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。基本思想:插入排序就好比如有一副杂乱的扑克牌,当你抓牌的时候,就是要将相同的摆在一起,并将牌从小到大(从大到小)的顺序排列。核心操作:扑...
2021-10-23 16:11:25
411
1
原创 归并排序及求逆序对数
什么是归并排序?归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。...
2021-10-22 12:00:46
1529
1
原创 并查集模板
#include <bits/stdc++.h>using namespace std;int sum=0;int pre[1000001];int vis[1000001];/*int find(int x){//压缩寻找路径 ;寻找时为了避免成为单叉数,变n叉数,以节约时间 if(pre[x]==x)return x; return pre[x]=find(pre[x]);//找的时候就把该点的根节点给找到并替换 } */int find(int x){//暴力寻找根节.
2021-07-22 10:42:54
129
原创 最短路问题的总结与反思
最短路问题的总结与反思前言什么是最短路问题?每当我们使用BD(还有GD和TX)地图的时候,每当我们输入我们的目的地,软件会自动给我们分配路径,而这些路径包括这到达所需要的时间和所需要的路程,这个就是最短路问题。我们给定一个定义:给定一个有向图G=(V,E),,,节点以[1,n]之间的连续整数编号,(x,y,z)描述一条从x出发,到达y,长度为z的有向边。最短路问题所需要什么算法思想?对于最短路问题,我们有三种算法来计算最短路。1.Floyd算法2.Dijkstra(迪杰斯特拉)算法3.B
2021-07-22 10:32:26
895
ACM模板(数据结构)
2023-05-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人