
数据结构
文章平均质量分 74
Selvaggia
这个作者很懒,什么都没留下…
展开
-
旅游规划(树的直径上所有节点)
【代码】树的直径上所有节点。原创 2023-04-01 23:22:41 · 290 阅读 · 0 评论 -
1207. 大臣的旅费(树的直径)
【代码】1207. 大臣的旅费(树的直径)原创 2023-04-01 16:22:02 · 82 阅读 · 0 评论 -
trie树(电话号码前缀)
trie树#include <iostream>#include <algorithm>#include <vector>#include <set>using namespace std;const int N=15;typedef long long ll;vector<string> v;set<ll> S;int main(int argc, char** argv) { int t; cin>原创 2022-04-30 23:29:34 · 369 阅读 · 0 评论 -
Billboard(线段树变形)
#include <bits/stdc++.h>#include <iostream> using namespace std;const int N=2e5+5;struct node{ int l,r,val;//线段树维护第l行到第r行的剩余最大宽度 }tr[N<<2];int h,w,n; int res;//每个通知对应放的行 void pushup(int u){ tr[u].val=max(tr[u<<1].val,tr[u&原创 2022-04-27 12:25:13 · 168 阅读 · 0 评论 -
D. Subarray Sorting9(思维+线段树)
D. Subarray Sorting题目分析线段树4个小小函数,找bug找到吐血题目D. Subarray Sorting分析这道题不该盯着排序,盯着怎么排序,只需要思考序列需要满足怎么样的条件才能使得 a,b数组通过排序能一一匹配成功从左到右依次考虑a[i]==b[i]首先要找到b[i]在a数组当中的位置,如果不存在肯定直接NOb[i]在a数组当中出现的位置可能有多个,用队列记录下来,找到b[i]在a种第一次出现的位置x,看b[i]?=min{1,x}如果b[i]不是最小的,对这段进原创 2022-04-26 22:51:30 · 347 阅读 · 0 评论 -
线段树板子
线段树板子单点修改,区间查询//#include <bits/stdc++.h>#include <iostream> #include <stdio.h>using namespace std;//#define int long longconst int N=2e5+5;int n,m;int w[N];struct node{//线段树要维护的信息 int l,r; int v;//该段的最大值 }tr[N*4];void pushu原创 2022-04-23 13:33:28 · 591 阅读 · 0 评论 -
根据前序遍历和中序遍历找后续遍历、层次遍历
这里写目录标题中序+前序 ——> 后序法一:将数组传参法二:将中序下标传参,前序的root传参(前序遍历中总能找到 根节点、左子树根节点、右子树根节点)中序+前序 ——> 层次遍历中序+前序 ——> 后序法一:将数组传参由中序遍历和前序遍历得到后续遍历(镜像翻转或不翻转)这是之前的老做法,把数组作为参数,每次传具体某一段数组的首地址麻烦的地方在于,有时候找不准某段数组的首地址以下标0开始的数组,str【i】为首的数组段,地址是str+i以下标1开始的数组,str【i】为首的数原创 2022-04-13 16:59:08 · 934 阅读 · 1 评论 -
7-17 根据后序和中序遍历输出先序遍历 (25 分)
7-17 根据后序和中序遍历输出先序遍历 (25 分)不建树,直接输出#include<iostream>#include<string.h>using namespace std;int hs[35];int zs[35];int n;//int flag=1; void print(int str1[],int str2[],int len){ if(len==0)return ;// else if(len==2){//先输出后序遍历最后一个正着这个规律原创 2022-01-27 14:41:10 · 620 阅读 · 0 评论 -
相同的球放入不同的盒子,单源最短路径
@TOC货物摆放暴力搞不定有点搞笑,暴力搞不定,极其缓慢#include <iostream>#include <algorithm>#include <set>using namespace std;#define int unsigned long longconst int N=105;int a[5];struct node{ int x,y,z; node(int x,int y,int z):x(x),y(y),z(z){ }原创 2022-04-06 22:10:02 · 1069 阅读 · 0 评论 -
扰乱字符串(递归思想,区间dp做法)
扰乱字符串递归思想不管想用递归还是区间dp,首先都要搞清楚扰乱字符串基础的思想。有字符串S1,要得到它的扰乱字符串S2,可以将S1拆成【0,i),【i,n)这两段,这两段可以交换位置或者不换,合并在一起得到S1’,对于S1 ’ 合并前的那两段子字符串,对它们两个都可以进行拆分互换或不换的操作,最后得到字符串S2。但是,有一个隐含却显然的条件需要明确,那就是 对一个字符串进行拆分互换 的操作,之后得到的字符串 仍然是在这块位置、这一段。我发现许多可利用到递归的题目都是如此(最新的一道就是code fo原创 2022-04-01 20:54:50 · 1259 阅读 · 0 评论 -
B. Code For 1(思维,模拟二叉树中序遍历特征)
B. Code For 1题意:给定一个数n, 如果这个数大于1,把这个数拆分成3个数成为一个序列,对于序列中大于1 的数 进行以上操作,直到序列中只有0和1,问区间【l,r】内有多少个1n的数据范围不超过2502^{50}250,int数据范围是2322^{32}2321125899906842623 1 100001这个魔鬼样例,超出题目说的范围了,恰好2502^{50}250这张图片好看,节点内的数值是中序遍历的序号#include <iostream>#includ原创 2022-03-31 20:12:28 · 1067 阅读 · 0 评论 -
数据结构 哈夫曼树
Fence Repair#include <iostream>#include <queue>typedef long long ll;using namespace std;int main(){//要把一根木头锯成n段,给出每一段的长度,每锯一次的代价是锯成两段前//对应的长度,问n-1次按怎样的顺序锯使得代价最小//流程反一下,就是将n段木头拼成一段,可以将任意两段木头拼在一起//哈夫曼树的问题,最小的两个元素相加得到的新的元素插到序列之中,//继续找最小的原创 2022-03-30 22:19:44 · 748 阅读 · 0 评论 -
树状数组(求子区间和+更新元素值)
树状数组欲完成修改值和查询区间和两种操作求前缀和的做法时间复杂度为O(n)O(n)O(n)使用树状数组时间复杂度降为O(logn)O(logn)O(logn)lowbit1、x&(-x)2、x- ( x&(x-1) )3、x&(x^(x-1))lowbit累计1出现的次数树状数组思想求前缀和操作修改更新操作练兵场[【模板】树状数组 1——单点更新,区间查询](https://www.luogu.com.cn/problem/P3374)241. 楼兰图腾(y轴上区间段)欲完成修改值原创 2022-03-18 23:22:19 · 659 阅读 · 0 评论 -
树的直径 两次dfs(起点到其余各点最大距离)、树形dp(各点到其子树叶子节点的最大距离)
树的直径定义法一、两次dfs、bfs思想证明优点缺点实现代码法二、树形dp思想证明优点缺点实现代码题目集参考定义直径 : 在圆上两点(不相交)之间最远的距离就是我们通常所说的直径。树的直径 : 树上最远的两个节点之间的距离就被称为树的直径,连接这两点的路径被称为树的最长链(一开始,下意识地以为是,找到某个节点到它子树中叶子节点的最大距离,显然不是)法一、两次dfs、bfs思想先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径。证明①若P已经在原创 2022-03-03 21:34:37 · 1218 阅读 · 0 评论 -
Trie树(字典树)
目录碎碎念式讲解变量解释AcWing 835. Trie字符串统计(模板题)碎碎念式讲解Trie树用来快速存储、查找字符串集合的数据结构要么全大写字母,全小写字母,全数字,全0、1字母个数不会很多高效的查找某个字符串在Trie树种是否出现过、出现过多少次哈夫曼树典型用堆来做(和trie树长得比较像,但是不一样)Dijiskra,很多贪心,dp都需要用到堆优化每个节点最多向外连26条边p编号节点不存在u这个节点的话,就添加上一个节点,编号顺移以这个节点(用编号指示)结尾的单词数量多了一个原创 2022-02-24 11:22:56 · 437 阅读 · 0 评论 -
compress words (KMP/字符串哈希,双哈希)
compress words连接若干单词,规避单词尾和下一个单词首的重复字段kmp求最长相同前后缀字符串双哈希题目链接连接若干单词,规避单词尾和下一个单词首的重复字段kmp求最长相同前后缀交到coedforce上,next数组报错,应该是同名了,保险起见改成nex 还是对kmp算法的理解不够深刻,成功匹配时j=le, 不成功,一种是不相等,终究还是主串比完了也没能全部匹配上 就看最后这个j表示匹配哪儿 如果主串最后一个字符也未能与s[0]比较成功,j就会变为-1,继而加一得0 想象匹原创 2022-02-15 11:56:06 · 1304 阅读 · 0 评论 -
字符串哈希,求删除任一个字符后的字符串哈希值,双重哈希
字符串哈希,求删除任一个字符后的字符串哈希值,双重哈希题目**思路:**求删除任一个字符后的字符串哈希值如何计算将原字符串改变若干个字母后的哈希值。(不过有一个限制,就是在求字符串的哈希时,只有一个变量,而不是开了一个数组记录每一位的哈希值)双重哈希写法双重哈希模板题目https://ac.nowcoder.com/acm/contest/1076/G题目描述给你两个只由小写字母组成的字符串S,T,保证S的长度大于等于T,现在你必须删除T串中一个字符,使得T串变成S串的子串,输出删除的位置,如果有多原创 2022-02-14 16:20:34 · 345 阅读 · 0 评论 -
哈希表、字符串哈希(特别的kmp)
哈希表、字符串哈希(特别的kmp)哈希表存储结构(处理冲突)拉链法840. 模拟散列表开放寻址法字符串哈希法841. 字符串哈希(kmp的一种特别形式)哈希表存储结构(处理冲突)拉链法链式前向星存储邻接表的结构哈希表长度取成一个质数,且离2的整次幂尽可能远,大于题目查找范围的最小质数840. 模拟散列表维护一个集合,支持如下几种操作:I x,插入一个数 x;Q x,询问数 x 是否在集合中出现过;现在要进行 N 次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数 N,表示操原创 2022-02-14 15:32:15 · 761 阅读 · 0 评论 -
【模板】KMP字符串匹配
KMP字符串匹配中next数组求法【模板】KMP字符串匹配KMP字符串匹配中next数组求法char* strstr(char*str,char*pattern);//字符串很小O(m.n) 子串里面一头一尾有可以匹配上的小串,指针不用每次都回溯到最最开头的位置。匹配前,对模式串进行详细分析, 搞清楚next值的含义,p[0 ~ j]==p[ (i-j) ~i] ,即从p[0]开始长度为len=j+1,都有p[j]=p[i] 那么一旦p[i+1]与t[?]不相等了,t[?]下一个就要与p[j.原创 2022-02-13 09:39:52 · 1167 阅读 · 0 评论 -
最小生成树
最小生成树树、生成树、最小生成树实现最小生成树的两种算法一、prim (普里姆算法)——让一棵树长大二、kruskal算法 ——合木成林树、生成树、最小生成树树:一个无向连通图,不包含回路(连通图中不存在环,该无向连通图就是树生成树:覆盖途中每一个顶点的树最小生成树:有权网络中满足 各边权值 之和最小的支撑树一个有N个点的图,边一定是大于等于N-1条的。图的最小生成树,就是在这些边中选择N-1条出来,连接所有的N个点。这N-1条边的边权之和是所有方案中最小的。应用:要在n个城市之间铺设光缆,原创 2022-02-09 20:14:27 · 1059 阅读 · 0 评论 -
最短路径问题
最短路径之Dijkstra、Floyd算法无权图的单源最短路算法有权图的单源最短路算法Dijkstra算法多源最短路算法无权图的单源最短路算法按照递增(非递减)的顺序找到各个顶点的最短路从源点开始找邻接结点,一圈一圈向外扩展,有点像BFSdist[w]记录w到源点的最短距离 初始化为一个不可能的值记录最短距离的同时 可以发挥vis数组的作用 通过判断dist[w]的初值来判断是否访问过dist[s]初始化为0 path[w]记录到达w的这条最短路径上w的上一个节点届时把w,path[w],p原创 2022-02-09 13:43:34 · 1034 阅读 · 0 评论 -
树形 DP
树状DP简单入门题[P1352 没有上司的舞会](https://www.luogu.com.cn/problem/P1352)一、dfs方法更周到的解法二、bfs+for循环(终于有点理解为什么说dfs能做到的bfs都可以做到了)从底部节点开始,节点由孩子信息推出(叶子节点孩子信息为0哪)三、拓扑排序(节点fa[x]由节点x信息推出)[P2016 战略游戏](https://www.luogu.com.cn/problem/P2016)简单入门题P1352 没有上司的舞会一、dfs方法普通dp一般原创 2022-02-08 00:09:54 · 451 阅读 · 0 评论 -
链式前向星,链表头插法的思想,数组的形式(数组下标间接代替指针)
这里写目录标题链式前向星(本质是用数组模拟链表的邻接表)无向图edge数组要开有向图的两倍vector < Edge > G[]与链式前向星( 算法竞赛中存图最常见的两种方法)优缺点对比对链式前向星存储的边进行bfs、dfs链式前向星对于最短路问题可以有很好的效果,尤其是稀疏图上通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。【引自百度百科】链式前向星(本质是用数组模拟链表的邻接表)链式前原创 2022-02-07 22:19:31 · 1038 阅读 · 0 评论 -
n0=n2+1,N个结点的红黑树中红色结点的个数
[SDOI2008]红黑树(TREE) 题目对于任意一棵二叉树,终端节点(度为0的节点)数为n0,度为2的节点数为n2,则n0=n2+1贪心思路:树形DP写法题目https://ac.nowcoder.com/acm/problem/20319对于任意一棵二叉树,终端节点(度为0的节点)数为n0,度为2的节点数为n2,则n0=n2+1n个节点有n-1条边,度为2的节点对边的贡献度为2对于节点数:n=n0+n1+n2; ①对于变数: n-1=n1+n2 * 2; ②①–②式原创 2022-02-07 15:57:49 · 1458 阅读 · 0 评论 -
AVL树实现代码、红黑树参考链接
AVL平衡二叉树的调整最基本最稳的规律——LL——第一个不平衡节点右旋一次RR——第一个不平衡节点左旋一次LR——涉及的节点有三个g,p,q,第一个被破坏节点g,g的左孩子g->left(记作p),g的左孩子的右孩子p->right(记作q)(不一定是被插入节点噢,被插入节点可能是q,也可能在q的左/右子树,但不管是三种情况中的哪种,只关心q)RL——先右旋再左旋根据**插入节点位于被破坏节点的方位**,将不平衡的情形分为4类——LL,RR、 LR、RL删除总体测试平衡二叉树的调整被插入/删原创 2022-02-06 15:03:54 · 808 阅读 · 0 评论 -
7-12 一元多项式的乘法与加法运算 (20 分)(链表~)
7-12 一元多项式的乘法与加法运算 (20 分)再也不想用链表了,这么长,老是要用打印语句去纠错,还wa了//#include<iostream>//#include<stdio.h>//#include <stdlib.h>//#include <math.h>//#include<algorithm>//#include <bits/stdc++.h>//----------------不许写万能头#includ原创 2022-01-23 14:37:51 · 535 阅读 · 0 评论 -
priority_queue<double,queue<double>,greater<double> >自动排序、stack辅助后置表达式计算
这里写目录标题一级目录字符串截取一级目录字符串截取 截取字符串 1、对于char数组有strtok char str[10]={}; const char spilt[5]; char*p=strtok(str,spilt); while(p){ cout<<p<<endl;//输出字符串只需要首地址啦 p=strtok(str,spilt); //继续分隔 } 2、对于string类型字符串 string str=" nxj"; stri原创 2022-01-19 22:56:58 · 588 阅读 · 0 评论 -
表达式求值问题 运算符优先级打表
6263:布尔表达式6263:布尔表达式优先级打表思路传送门6263:布尔表达式#include <bits/stdc++.h>using namespace std;#include <iomanip>map<char,int> mp;char piority[7][7]={//行是操作数栈中的栈顶操作符,看优先级是否大于遍历表达式之后遇到的运算符 // | & ! ( ) # {'>','<','<','<','&g原创 2022-01-19 17:57:39 · 560 阅读 · 0 评论