数据结构
字面意思
林中的亮光
沉着冷静淡定
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
点分治入门
点分治,是一种针对可带权树上简单路径统计问题的算法。本质上是一种带优化的暴力,带上一点容斥的感觉。注意对于树上路径,并不要求这棵树有根,即我们只需要对无根树进行统计。接下来请把无根树这一关键点牢记于心。下面给出一道例题 : poj的1741对于不合法路径,我们该如何删除呢?我们可以这样来处理:不妨假设当前的父亲节点是图中的点A,其遍历到了儿子B,对于不合法路径,其实就相当于要筛除以B2为父节点来计算的路径不超过K的个数 ,这是因为若以B为父节点,原先不合法的合并在B中..原创 2022-04-12 17:02:02 · 526 阅读 · 0 评论 -
区间离线问题----莫队算法例题取根号n时间复杂度证明
莫队算法:其核心思维就是对于 区间查询 操作,通过对所有 “被询问的区间进行” 合理的排序 ,然后通过 暴力移动区间的左右端点 并 快速更新答案 得到所有询问的结果。-----摘自这里题目链接:小Z的袜子细节问题这里不诉说了,下面来证明一下如何计算时间复杂度以及为何这样最优。对于这一问题的证明如下:代码如下:#include<bits/stdc++.h>using namespace std;const int N ...原创 2022-03-30 16:43:21 · 796 阅读 · 0 评论 -
蓝书----分块模板
利用暴力-----局部朴素,大段维护,极具美感。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 100010;int n,m;ll a[N],sum[N],add[N];int pos[N];int L[N],R[N];void change(int l,int r,ll d){ int p = pos[l],q = pos[r]; if(p == q) .原创 2022-03-28 21:41:34 · 268 阅读 · 0 评论 -
并查集应用
通常来说,并查集用来维护具有传递性质关系的集合,对于本题,可以巧妙使用并查集的地方在于:利用路径压缩,查找到还未使用的第一个数,例如 , 2已经被使用了,其父亲为4,4的父亲为100....可以实现高效率的查找。#include<iostream>#include<unordered_map>#include<cstdio> using namespace std;const int N = 5e5 + 10;unordered_map<int.原创 2022-03-03 13:59:08 · 495 阅读 · 0 评论 -
模拟 循环队列,堆
前言:之所以做这个模块,是因为上课找到书上的bug跟老师说,老师平时分给我加了俩分(卷起来了),是因为热爱数据结构,喜欢实践书中的内容加深理解,以便找出bug再加平时分。下给出模板。堆#include<stdio.h> #include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define SElemType int #define Status int #define O.原创 2021-10-28 20:25:09 · 171 阅读 · 0 评论 -
链表的头插法
部分代码:linklist p, q; //linklist为已定义好的单链表结构体,head为主函数中已分配内存空间的头指针。p = head->next;head->next = NULL;while (p != NULL){ q = (linklist)malloc(sizeof(node)); q = p; p = p->next; q->next = head->next; head->next = q;}顾名思义,就是在头原创 2021-10-26 21:12:44 · 1573 阅读 · 0 评论 -
数据结构(二)
(1)单调队列:典型问题----滑动窗口#include<iostream>#include<algorithm>using namespace std;const int N=1000010;int n,k;int a[N],q[N],hh=0,tt=-1;//tt=-1表示目前还没有元素。//个人理解,对于冗杂数据,由于是单调队列,靠近对首的值越小,对于一个对尾,如果插入的a[i]《=它,//由于a[i]生存周期比它久,所以这个冗杂元素一定不会被用到。int原创 2021-09-22 10:42:37 · 157 阅读 · 0 评论 -
并查集的思考
核心代码int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x];}其中包含了路径优化的原理,也就是将所有节点指向祖宗节点原创 2021-09-18 13:40:51 · 127 阅读 · 0 评论 -
模拟散列表
(1)拉链法#include<iostream>#include<cstring>using namespace std;const int N=200003,null=0x3f3f3f3f;int idx,e[N],ne[N],h[N];//可以理解为头指针;//寻找的时候是从下往上找。int insert(int x){ int k=(x%N+N)%N; e[idx]=x; ne[idx]=h[k]; h[k]=idx+原创 2021-09-22 11:27:57 · 135 阅读 · 0 评论 -
Trie字符串统计
#include <iostream>using namespace std;const int N = 1e5 + 10;int son[N][26]; // 其中存放的是:子节点对应的idx。其中son数组的第一维是:父节点对应的idx,第第二维计数是:其直接子节点('a' - '0')的值为二维下标。int cnt [N]; // 以“abc”字符串为例,最后一个字符---‘c’对应的idx作为cnt数组的下标。数组的值是该idx对应的个数。int idx; .原创 2021-09-17 21:50:47 · 122 阅读 · 0 评论 -
数据结构(一)
一.链表(1)单链表1.head 表示头指针下标2.e[i]储存节点的值,ne[i]储存下一节点的地址。原创 2021-09-17 11:03:51 · 449 阅读 · 0 评论 -
KMP算法回顾
kmp算法,就是对暴力匹配字符串算法的优化。首先要了解一下前缀和后缀的匹配过程(借自文章)https://www.acwing.com/solution/content/14666/3、“非平凡前缀”:指除了最后一个字符以外,一个字符串的全部头部组合。4、“非平凡后缀”:指除了第一个字符以外,一个字符串的全部尾部组合。(后面会有例子,均简称为前/后缀)next数组的含义及手动模拟(具体求法和代码在后面) 然后来说明一下next数组的含义:对next[ j ] ,是p[ 1, j ]串中前缀原创 2021-09-17 15:51:16 · 185 阅读 · 0 评论
分享