
数据结构
文章平均质量分 62
chp的博客
这个作者很懒,什么都没留下…
展开
-
AcWing 1275. 最大数—线段树单点修改
拿区间[1,10]举例,可分为如图所示的小区间,由于这里和堆很像,所以也是用数组来存所有的点,最多不超过4n个区间。能使用线段树的题有一些特点,就是大区间的属性能从小区间得到,比如求max,max([1,10])=max{max([1,5]),max(6,10)},线段树一共有4个基本操作,分别是。线段树是以区间来考虑问题,保存的基本信息有区间的左边界、右边界、区间的属性(sum、min、max…:由两个子区间更新父区间,例如max([1,10])=max{max([1,5]),max(6,10)}原创 2023-07-25 17:01:24 · 194 阅读 · 0 评论 -
数据结构—树状数组
树状数组初学起来还是比较难以理解,过弄明白之后代码就很好写了,树状数组相当于是拿空间换时间,原数组为。(将a[i]变成b,就相当于a[i]+b-a[i],更改操作可以转换成+操作)都需要更改其对应的。树状数组是用来快速求前缀和的,传统的单点修改、区间查询要么单点修改的复杂度是。,树状数组相当于一个比较综合的算法,树状数组的查询时间复杂度和修改时间复杂度都是。下面这张图基本上是讲解树状数组必用的一张图。这是查询操作,我们还需要修改操作,每次修改。有一道树状数组的最经典例题可以做一下,假设我们已经维护好了。原创 2023-07-21 14:36:21 · 256 阅读 · 0 评论 -
AcWing 239. 奇偶游戏—带边权并查集、带扩展域并查集解法
这道题比较有意思,可以由前缀和的思想来解决,[l,r]为偶数,说明[0,l-1]和[0,r]的奇偶性相同;[l,r]为奇数,说明[0,l-1]和[0,r]的奇偶性不同;扩展域的解法我是第一次遇到,大致的思想就是用并查集维护条件,当其中一个条件成立,那么集合中所有条件都应该成立。是一种带边权的并查集,维护当前节点相对父节点位置即可,食物链那道题有三种情况,同类、吃、被吃,这道题只有两种情况,奇、偶。原数据的范围是[0,n],开辟一个新的空间(域)来表示不同的情况。举个例子,假设题目中x,y的范围原创 2023-07-20 11:27:11 · 293 阅读 · 0 评论 -
AcWing 106. 动态中位数—对顶堆
这道题应该用树状数组、平衡树也能解决,这里用对顶堆来做,对顶堆能够用维护第。是固定的,在这道题中,维护两个堆,一个大根堆一个小根堆。原创 2023-07-15 17:10:07 · 290 阅读 · 0 评论 -
AcWing 1273. 天才的记忆—RMQ
举个例子,比如区间[1,5]长度为6,那么k=2小区间的长度为4,第一个小区间是为[1,4],第二个小区间为[3,6],这两个小区间刚好完全覆盖大区间[1,5],所以在这两个小区间中取一个max,就得到了大区间的max,这样就能在。是用来求解静态区间最大/小值的算法,静态空间就是数组里的数不会变,动态空间最大/小值可以用。我们可以将这个区间分成两小,第一个小区间是从l开始,长度为。来求这个区间的最大值呢,因为这个区间长度也不一定是。,下面讲解一下这个算法步骤,做过。,第二个区间是从r结束,长度为。原创 2023-07-13 20:42:27 · 251 阅读 · 0 评论 -
动态规划之—状态机模型(大盗阿福、没有上司的舞会)
这种需要向前看两步,所以为了方便我们遍历从2~n+1。这是一道比较简单的动态规划—状态机的问题,可以用。的思想或者DP状态机的思想来做。DP状态机来表示状态一般比较清晰。原创 2023-04-23 16:53:48 · 210 阅读 · 0 评论 -
多重背包问题的三种解法(转化为01背包、二进制拆分、单调队列优化)
这里考虑用单调队列优化,首先分析01背包与完全背包,进而推导出多重背包的单调队列优化。这时直接拆分为s份,转化为01背包问题求解会超时,考虑二进制拆分,二进制拆分参考。可以转化为01背包问题求解,将s个物品都看作单独的一个物品,时间复杂度为。原创 2023-04-21 16:39:05 · 980 阅读 · 0 评论 -
拦截导弹 & 导弹防御系统
第二个问题,可以用贪心的思想来做,每次新到的导弹,我们用当前导弹高度恰好大于等于该导弹高度的导弹系统去拦截,这样所用的导弹系统的数量是最少的。**分析:**这道题稍微复杂一些,因为有两种拦截导弹的可能,由于数据范围较小,可以直接暴力枚举每一种可能,第一个问题为输出最长递减子序列,由于导弹数在1000以内所以采用时间复杂度为。我这里求最长上升子序列和贪心的时间复杂度都为。** 代码如下:**原创 2023-04-17 10:34:38 · 3457 阅读 · 0 评论 -
链式前向星
链式前向星原创 2022-12-12 19:52:01 · 270 阅读 · 0 评论 -
快速幂、矩阵快速幂
斐波那契数列差不多是最简单的矩阵快速幂的应用,矩阵快速幂的难点在于如何构建一个矩阵,使其能够满足递推式。原创 2022-10-20 16:54:19 · 491 阅读 · 0 评论 -
Trie 树(字典树、前缀树)
Trie树原创 2022-06-14 09:03:02 · 297 阅读 · 0 评论 -
表达式求值(中缀)
原题链接给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。题目保证表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中,均不超过 231−1。题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如 5原创 2022-01-11 18:57:36 · 522 阅读 · 0 评论 -
Dijkstra求最短路(朴素做法与堆优化)
Dijkstra求最短路的基本思路是贪心算法,求解单源最短路。适用于求解正权边。算法的基本原理可以自行查看。这里讲解两种求最短路的方法:(1)、朴素算法朴素算法的时间复杂度为O(n2),适用于稠密图,用邻接表来存图,并且可以处理自环和重边。Dijkstra求最短路 I给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出1号点到n号点的最短距离,...原创 2020-09-15 19:20:00 · 275 阅读 · 0 评论 -
leetcode1004. 最大连续1的个数 III
题目链接:给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。示例 1:输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释: [1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。示例 2:输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3输出:10解释:[0,0,原创 2021-02-19 21:46:56 · 193 阅读 · 0 评论 -
积木大赛
题目链接输入样例:52 3 4 1 2输出样例:5分析: y总写的太好,直接转发了算法(差分,贪心)O(n)O(n)O(n)我们逆向思考:假设给定了每块积木的高度,每次可以将某一段区间中的所有高度减一,问最少操作多少次可以将所有高度变成0。原序列是: h1,h2,h3,…,hn,其中hi≥1h_1,h_2,h_3,…,h_n, 其中 h_i≥1h1,h2,h3,…,hn,其中hi≥1。构造差分序列:b1=h1b_1=h_1b1=h1b2=h2−h1b_2=h_2原创 2021-02-13 23:23:27 · 448 阅读 · 0 评论 -
C++ __int128的使用
```#include <bits/stdc++.h>using namespace std;void scan(__int128 &x) { //输入 x = 0; int f = 1; char ch; if((ch = getchar()) == '-') f = -f; else x = x*10 + ch-'0'; while((ch = getchar()) >= '0' && ch <= '9') x = x*10 + c.转载 2021-01-28 22:46:07 · 1850 阅读 · 2 评论 -
Row GCD(差分+辗转相减法)
这道题和上面的例题差不多,只是在最后需要通过判断q[0]的值来确定x的值。还有一道难一些的题,用到了树状数组。这道题用到了差分和辗转相减法,,因此我们只需要提前求出。根据辗转相减法可得到。原创 2021-01-12 19:43:24 · 1270 阅读 · 6 评论 -
食物链(并查集)
食物链动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是”1 X Y”,表示X和Y是同类。第二种说法是”2 X Y”,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。原创 2021-01-10 21:53:27 · 2224 阅读 · 2 评论 -
树状数组(区间修改,区间查询模板题)
区间修改,区间查询这是一道模板题。给定数列 a[1],a[2],…,a[n],你需要依次进行 q 个操作,操作有两类:1 l r x:给定 l,r,x,对于所有 i∈[l,r],将 a[i] 加上 x(换言之,将 a[l],a[l+1],…,a[r] 分别加上 x);2 l r:给定 l,r,求 ∑ri=la[i] 的值(换言之,求 a[l]+a[l+1]+⋯+a[r] 的值)。Input第一行包含 2 个正整数 n,q,表示数列长度和询问个数。保证 1≤n,q≤1e6。第二行 n 个整数 a原创 2020-11-08 22:07:58 · 1417 阅读 · 2 评论 -
树的重心
树的重心定义:树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。通俗点讲,就是在树中去掉一个点,删除这个点后,最大连通块(一定是树)的结点数最小。数的重心一些特性:树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个重心,他们的距离和一样。把两棵树通过一条边相连,新的树的重心...原创 2020-09-06 17:39:00 · 208 阅读 · 0 评论 -
离散化
这里只说一下离散化的简单思路(还不会难的(T _ T))离散化的就是将大范围的缩小到小范围来表示,这类问题一般是数的范围很大,但是个数不多,具体的思路是,将他们用一个数组来表示,查找其原位置时用二分查找即可。一个模板题:区间和假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。接下来,进行 m 次询问,...原创 2020-08-17 21:56:00 · 163 阅读 · 0 评论 -
最长公共子序列
模板题代码:#include<cstdio>#include<cstring>#include<algorithm>#include<string.h>using namespace std;const int N=1e3+10;int tmp[N][N];int main(){ int t; int l1,l2; char s1[N],s2[N]; scanf("%d%d",&l1,&原创 2020-05-11 22:20:30 · 508 阅读 · 1 评论 -
求解最长上升子序列的三种方法
动态规划O(N^2)这种算法主要是依靠前面已经得出的最长递增子序列,来推出当前的最长递增子序列。例:当前遍历到m时,值为n(1)dp[ m ]=1,n为当前最大值(2)dp[ m ]=max(dp[ m ],dp[ 1~ m]+1),n要大于当前的数才能进行比较,+1表示把m点也算入序列中代码如下:#include<cstdio>#include<cstring>#include<algorithm>using namespace std;原创 2020-05-09 23:10:51 · 2721 阅读 · 1 评论 -
动态求连续区间和---树状数组
[动态求连续区间和](https://www.acwing.com/problem/content/1266/):给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b]的连续和。输入格式第一行包含两个整数 n 和m,分别表示数的个数和操作次数。第二行包含 n 个整数,表示完整数列。接下来 m 行,每行包含三个整数 k,a,b(k=0,表示求子数列[a,...原创 2020-03-31 22:33:28 · 256 阅读 · 2 评论 -
数星星--树状数组
数星星天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。如果一个星星的左下方(包含正左和正下)有 k 颗星星,就说这颗星星是 k 级的。例如,上图中星星 5 是 3 级的(1,2,4 在它左下),星星 2,4 是 1级的。例图中有 1 个 0 级,2 个 1 级,1 个 2 级,1 个 3 级的星星。给定星星的位置,输出各级星星的数目。换句话说,给定 N 个点...原创 2020-04-01 20:52:57 · 486 阅读 · 0 评论 -
acwing 798(二维差分)
差分矩阵题意:给定一个矩阵,进行q次改变操作(给定小矩阵x1 y1 x2 y2,将小矩阵中的数同时+c),输出改变之后的矩阵。思路:构建一个二维差分数组b[ ][ ],每次小矩阵x1 y1 x2 y2增加时对差分数组b的改变操作为b[ x1 ][ y1 ]+=c;b[ x2 +1 ][ y1 ]-=c;b[ x1 ][ y2+1 ] -=c;b[ x2 + 1...原创 2020-02-05 14:55:47 · 206 阅读 · 0 评论 -
acwing 797(一维差分)
一维差分题意:输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c,输出最终序列分析:用到了一维差分的知识,可以理解一维差分是和前缀和相反。一维差分的构建:当数组a与差分数组数组b内元素都为0时,显然b是a的差分数组;当数组a不全是0时,a[ i ] = b[ 0 ] + b[ 1 ]+……b[ ...原创 2020-02-05 00:06:00 · 408 阅读 · 0 评论 -
acwing796. 子矩阵的和
题目传送门题意:给定n*m的矩阵q次查询,每次查询给出小矩阵x1 y1 x2 y2输出该小矩阵的和。主要是用了二维前缀和的知识。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e3+10;int a[maxn][...原创 2020-02-04 22:48:23 · 278 阅读 · 0 评论 -
数据结构—拓扑排序
#include<iostream>#define OK 1using namespace std;const int MAX=1e5;const int maxn=1e2+10;const int dot=11;//点的个数; int aov[maxn][maxn];//存图;int voa[maxn][maxn];//逆邻接表; int vis[maxn];//存...原创 2019-12-24 11:23:18 · 778 阅读 · 0 评论 -
N皇后问题
hdu2553dfs一直往下搜索,每次chack一下是否满足要求,即可代码如下:#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int maxn=30;int vis[maxn];//记录...原创 2019-12-03 20:43:38 · 121 阅读 · 0 评论 -
RGB Substring (hard version) CodeForces - 1196D2
题目传送门分析:此题用到了前缀和,能够降低时间复杂度,代码比较容易理解#include<cstdio>#include<iostream>#include<algorithm>#include<string.h>#include<cstring>using namespace std;const int maxn...原创 2019-11-19 21:43:45 · 158 阅读 · 0 评论 -
数据结构——BF
#include<stdio.h>#include<string.h>using namespace std;const int maxn=1e5+10;int la;int lb;int ant=0;char a[maxn];char b[maxn];int abc(int x){ for(int i=x;i<lb+x;i++) { an...原创 2019-11-05 16:05:46 · 154 阅读 · 0 评论 -
数据结构——舞者匹配
#include<stdio.h>#include<string.h>using namespace std;#define maxsize 100#define OK 1#define ERROR 0 #define OVERFLOW -2typedef int status;struct node { char name[20]; ch...原创 2019-11-05 15:50:37 · 277 阅读 · 0 评论 -
单链表
#include<stdio.h>#include<iostream>#include<string.h>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2struct node{ char xuehao[20]; char name[20]; int grad...原创 2019-10-22 15:27:17 · 139 阅读 · 0 评论 -
线性表
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2struct node{ char xuehao[20]; char name[20]; int gra...原创 2019-10-22 15:26:20 · 119 阅读 · 0 评论