数据结构
文章平均质量分 55
ACM数据结构
明月千里赴迢遥
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线段树简单笔记
一 经典线段树 结构:权值为[L,R]的区间和 int L,R,sum; 操作1 单点修改O(logn) 递归找到相应叶子节点,回溯时修改父节点(两个儿子总和) 操作2 区间查询O(logn) 左右两边递归,递归边界为左右两边都被包含,累加其权值 最坏耗时4logn 区间修改需要懒标记,蓝桥杯一般考不到,即使考到也是特殊区间修改,用不到 函数 1 pushup 用子节点信息更新当前节点信息 2 build 在一段区间上初始化线段树 3 modify 单点修改 4 query 区间查询 静态链表存储,空原创 2022-03-20 12:39:28 · 810 阅读 · 0 评论 -
树状数组简单总结(原理见以往帖子)
树状数组:快速(动态)求前缀和 在线算法(支持修改) O(logn) 1:给某个位置上的数加上一个增量(修改某个元素) 2:求某个前缀和 即:单点修改,区间查询(sum(r)-sum(l-1)) 树状数组只能支持这俩问题,别的问题都得通过转化才能解决 比如区间修改,单点查询 需要利用差分转化为区间修改 记树状数组为C[x],定义: C[x]=(x-lowbit[x],x],即x-lowbit[x]+1~x,奇数为其本身 lowbit[x]=x&-x,含义是2^k,k为x...原创 2022-03-15 00:12:02 · 630 阅读 · 0 评论 -
在函数中修改指针需要传入二级指针
参考文献 如果忘记这一点 写链表将寸步难行转载 2021-10-17 23:36:51 · 209 阅读 · 0 评论 -
并查集判断成环 HDU 1272
加入边前判断两个节点是否根节点相同,如果相同那么成环,如果不同合并他们 比如1-2,1-3,2-3,加入2-3时2和3已经同属一个并查集了,成环 例题 HDU 1272原创 2021-09-09 16:08:54 · 371 阅读 · 0 评论 -
POJ 2182 普通权值线段树求第k小
模板写错了,研究了一个多小时,哭死 int kth(int root,int start,int end,int k) {//查询第k小值是多少 if(start==end) return start; int mid=(start+end)>>1,s1=tree[lson],s2=tree[rson]; if(k<=s1) return kth(lson,start,mid,k);//向左子树搜索 else return kth(rson,mid+1,end,k-原创 2021-08-31 03:10:32 · 485 阅读 · 0 评论 -
HDU 5249解题报告 权值线段树+动态开点+队列模拟
https://acm.hdu.edu.cn/showproblem.php?pid=5249 易错点 管道头部是后进先出的 由于样例没有体现这一点,我想当然的以为是先进先出,然后……浪费了几个小时 不过这几个小时我加深了对权值线段树的理解,也算是塞翁失马吧 值域从0开始 这个一定要注意 解题思路 in x": 代表重要值为x(0≤x≤109) 的请求被推进管道。 "out": 代表服务拉取了管道头部的请求。 "query: 代表我想知道当前管道内请求重要值的中间值....原创 2021-08-20 21:27:46 · 256 阅读 · 1 评论 -
字典树 HDU1251 HDU 5687
模板解决了四个问题,插入,查询是否存在这个单词,查询以这个字符串为前缀的单词数量,查询这个单词是否有前缀 https://leetcode-cn.com/problems/implement-trie-prefix-tree/solution/trie-tree-de-shi-xian-gua-he-chu-xue-zhe-by-huwt/ https://blog.youkuaiyun.com/qq_43906740/article/details/96474307?utm_medium=distribute.p原创 2021-08-19 02:24:16 · 127 阅读 · 0 评论 -
AC自动机模板
https://www.cnblogs.com/hyfhaha/p/10802604.html 易错点 多组数据初始化时,cnt要初始化为1,用完之后要对trie的son数组清0,其他可以不清0但是son必须清0,这个会影响拓扑和fail! 如果RE,一定是trie开小了,这样cnt++才会访问越界,而不是s,T之类的开小了 #include<cstdio>//https://www.cnblogs.com/hyfhaha/p/10802604.html #include<io.原创 2021-08-21 18:08:37 · 135 阅读 · 0 评论 -
后缀数组 注释详细
特别鸣谢党哥的PPT和精彩讲解 概念介绍 后缀 后缀数组可以解决大部分的字符串问题,如查找子串,最长重复子串,最长公共子串等。 后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串r的从第i个字符开始的后缀表示为Suffix(i),也就是Suffix(i)=S[i…len(S)-1]。比如 abcdefg 的suffix(5)就是fg。 后缀树 例S=“vamamadn” (因树的建立比较麻烦,用数组替代) 后缀数组 后缀数组(SA[i]存放排名第i大的原创 2021-08-21 04:02:16 · 829 阅读 · 1 评论 -
并查集总结
目录 普通并查集 带权并查集 种类并查集 可持久化并查集 普通并查集 解决的问题:朋友的朋友是朋友 解题报告:https://blog.youkuaiyun.com/qq_54886579/article/details/119395026 模板 #include<cstdio> #include<iostream> using namesapce std; /*并查集: 合并(Union)、查找(Find)、集合(Set) 1 合并: 合并两个集合 2 查找: 判断两个元原创 2021-08-17 23:24:31 · 225 阅读 · 0 评论 -
可持久化并查集
模板题 https://www.luogu.com.cn/problem/P3402 可持久化数组+并查集=可持久化并查集,下面为合成思路 并查集是fa[]数组 初始状态下fa[i]=i 1 a b 合并 a,b所在集合; 先查找fa[a]和fa[b] 再判断fa[a]和fa[b]的秩,令秩小的当fa[a] 之后对fa[a]进行一次修改,将其更新为fa[b] r[i]=update(1,n,root,fa[a],fa[b]); 最后修改深度,如果rank[a]==rank[b],rank[b]++,否原创 2021-08-17 23:15:52 · 146 阅读 · 0 评论 -
可持久化数组
原理 https://www.cnblogs.com/liuwenyao/p/10994589.html 模板 #include <iostream>//可持久化数组 https://www.cnblogs.com/liuwenyao/p/10994589.html #include <cstdio>//板子题https://www.luogu.com.cn/problem/P3919 #include <algorithm>//版本号从0开始 a[]数组从1原创 2021-08-17 17:09:47 · 139 阅读 · 0 评论 -
滑动窗口题解Poj 2823 单调队列数组实现
http://poj.org/problem?id=2823 模拟 n=8 k=3 1 3 -1 -3 5 3 6 7 先求最大值,用单调递减队列,输出队头 head=1,这样q[head]就直接是队首元素下标了 h=1 t=0 i=1 1 空队列,1入队 h=1t=1 i=2 3 1<3出队 h=1t=1 i=3 3 -1 3>-1,-1入队 i>=k,输出队头3 i=4 3 -1 -...原创 2021-08-03 21:53:32 · 254 阅读 · 0 评论 -
HDU 1394 树状数组求逆序数
注释详细,如有疑惑请移步树状数组总结 /*求逆序数 A[i]默认值为0,一个数加入序列使A[i]+=1,表示该数出现,求i的前缀和相当于求比i小的数的数目s 那么比i大的数为n-1-s,n为加入该数后当前序列数量,用动态规划的方式一个个加入数求总逆序 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; const原创 2021-08-09 14:31:52 · 158 阅读 · 0 评论 -
带权并查集 HDU 3038
#include<cstdio> #include<iostream> using namespace std; const int N=1e6+1; int father[N];//并查集用数组实现,根节点的话father[i]=i int value[N];//记录权值 void inf(int n)//初始化 { for(int i=1;i<=N;i++) father[i]=i; } int findFather(int x)//路径压缩 { if (x !.原创 2021-08-05 02:30:09 · 247 阅读 · 0 评论 -
POJ 3264 Balanced Lineup ST表(区间最值问题RMQ)
问题翻译 对于每天的挤奶,农夫约翰的N头奶牛(1≤N≤50,000头)总是按照相同的顺序排着队。 一天,农夫约翰决定和一些奶牛组织一场极限飞盘游戏。 为了简单起见,他将从挤奶队伍中挑选连续的奶牛来玩游戏。 然而,对于所有的奶牛来说,它们的身高不应该相差太多。 Farmer John列出了Q(1≤Q≤20万)潜在牛群及其身高(1≤身高≤1,000,000)。 对于每一组,他希望你帮助确定组中最矮的奶牛和最高的奶牛之间的身高差异。 输入 第1行:两个用空格分隔的整数N和Q。 行2 . .N+1:第i+1行原创 2021-08-04 15:04:19 · 266 阅读 · 0 评论 -
POJ 3468区间修改区间查询
这题不讲武德,说好的Ai<=1e9,在int范围内,结果初始值竟然需要用到long long不然过不了 不讲武德 //区间修改、区间查询 http://poj.org/problem?id=3468 #include<cstdio> #include<iostream> using namespace std; const int N=1e6+10; typedef long long ll; ll A[N],C[N],D[N],tree1[N],tree2[N];//C原创 2021-08-07 23:52:18 · 137 阅读 · 0 评论 -
How Many Tables 普通并查集
天是伊格那丢的生日。他邀请了很多朋友。现在该吃晚饭了。伊格那丢想知道他至少需要多少张桌子。你要注意,并不是所有的朋友都认识彼此,所有的朋友都不想和陌 生人呆在一起。 这个问题的一个重要规则是如果我告诉你A认识B, B认识C,这意味着A B C彼此认识,所以它们可以留在一个表中。 例如,如果我告诉你A知道B, B知道C, D知道E,那么A, B, C可以留在一个表中,而D, E必须留在另一个表中。所以伊格那丢至少需要两张桌子。 输入以整数T(1<=T<=25)开始,表示测试用例的数量。 然后是.原创 2021-08-04 22:45:36 · 216 阅读 · 0 评论 -
POJ 1166 敌兵布阵 单点更新 区间求和 树型数组
#include<cstdio> #include<iostream> #include<cstring> #include<string> using namespace std; const int N=5e4+10; int tree[N],a[N]; inline int lowbit(int x){ return x&(-x); } void updata(int x,int value,int n){ while(x<=n){ .原创 2021-08-07 03:15:29 · 121 阅读 · 0 评论 -
C++ 操作符优先级问题 三目运算符右结合问题
运算符优先级 三目运算符右结合说明转载 2021-08-05 23:36:22 · 687 阅读 · 0 评论 -
P1525 [NOIP2010 提高组] 关押罪犯 种类并查集 思路剖析
https://www.luogu.com.cn/problem/P1525 思考:为什么匹配到仇恨值最大的朋友(敌人的敌人)输出的仇恨值最低? 答案:所谓朋友,就是分配在同一座监狱,所谓敌人,就是分配在不同的监狱 既然他们是朋友了,也就是说由前置条件已经无法再分到不同的监狱了,即使这对朋友仇恨值最大,也没办法了,所以他们的仇恨值就是最小的最大仇恨值分配方案 从代码的角度: if(Find(x) == Find(y)) { printf("%d\n", a[i].c); break; ...原创 2021-08-05 18:15:38 · 225 阅读 · 0 评论 -
POJ 1182 食物链 种类并查集 三种
POJ 1182 重要思路如下图所示,细节见代码注释,不懂的见往期博客关于并查集的文章 文字版 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 设A是同类,B是食物,C是天敌 同类吃食物 食物吃天敌 天敌吃同类 思路:开3N的并查集,1~N是同类,N+1~2N是食物,2N+1~3N是天敌 即 x本身为i(i∈[1,n]) x的食物为i+n x的天敌为i+2*n 这是种类并查集的性质1 重难点1:合并算法 {...原创 2021-08-06 01:12:00 · 158 阅读 · 0 评论 -
Bad Hair Day Poj 3250 单调栈模板题
10 3 7 4 12 2 逆向思维,求每头牛被其他牛看到的数量 cnt=0 i=0 10 cnt+=0 i=1 10 3 单增栈 cnt+=1 cnt=1 i=2 10 3 7->10 7 cnt+=1 cnt=2 i=3 10 7 4 cnt+=2 cnt=4 i=4 10 7 4 12->12 cnt=4 i=5 12 2 cnt=5 算法抽象:维护单增栈,cnt+=stack.size()-1 陷阱 等高看不到 10 10 一个都看不到 10 5 10 答案应为...原创 2021-08-03 23:55:11 · 112 阅读 · 0 评论 -
普通线段树总结
优点:修改快,求和快 对于某一类问题,我们主要关注的是一个线段或者区间。对于给定区间,更新区间中一个元素或者一个区间的值,查询一个区间[i,j]的最大值、最小值,或者区间数字和。 线段树不一定满二叉树,也不一定是完全二叉树,但一定是平衡二叉树 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二原创 2021-08-08 01:30:30 · 232 阅读 · 0 评论 -
区间修改 单点查询模板题 洛谷P3368
#include<cstdio> #include<iostream> using namespace std; const int N=5e5+10; int n; int A[N],C[N],tree[N]; inline int lowbit(int x) { return x&-x; } inline int read() { char c=getchar(); int s=0,w=1; while(c<'0' || c>'9') { if(.原创 2021-08-07 21:45:17 · 108 阅读 · 0 评论 -
魔咒词典题解——牛客
https://www.nowcoder.com/questionTerminal/c6ca566fa3984fae916e6d7beae8ea7f?orderByHotValue=1&mutiTagIds=5058&page=2&onlyReference=false 下解在杭电上内存超限过不去,牛客上可以,由于主要是练习map而不是hash,因此先不加深究 知识点: i. map的find找不到的话返回值为map.end() find引用具有指定键的元素的位置的...原创 2021-08-03 01:13:24 · 144 阅读 · 0 评论 -
士兵队列训练问题题解(杭电1276)
https://acm.hdu.edu.cn/showproblem.php?pid=1276 模拟: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 201 3 5 7 9 11 13 15 17 191 3 7 9 13 15 191 7 13 191 7 19 可以用多种方式做,这里用队列做 开个flag标志,flag为0按偶数去掉,flag为1按三倍去掉 size()<4结束筛选 接下来讨论删除 设置两个队列,一个个出队,循环操作,遇到待删元.原创 2021-08-02 21:45:45 · 524 阅读 · 0 评论 -
吐泡泡题解
链接:https://ac.nowcoder.com/acm/problem/15029?&headNav=acm 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 小鱼儿吐泡泡,嘟嘟嘟冒出来。小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o"。 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉。 (是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道。) 例如原创 2021-08-02 19:43:25 · 1508 阅读 · 1 评论 -
线段树总结(动态开点,zkw,权值,主席)
zkw线段树 https://www.cnblogs.com/Judge/p/9514862.html 上面这篇文章虽然有些谬误,但总体很棒 先上一篇带解析的总代码 带解析的总代码 //zkw线段树 https://www.cnblogs.com/Judge/p/9514862.html (queryMax和queryMin有错误) #include<cstdio> #include<algorithm> using namespace std; const int N原创 2021-08-10 03:15:58 · 1558 阅读 · 0 评论 -
树状数组总结
https://www.acwing.com/blog/content/513/ https://www.cnblogs.com/xenny/p/9739600.html 树状数组:用数组来模拟树形结构。 用途:解决大部分基于区间上的更新以及求和问题。 与线段树的区别:树状数组可以解决的问题都可以用线段树解决,树状数组的系数要少很多, 线段树就像 华为荣耀50, 而树状数组就像华为荣耀50的青春版,便宜了,但性能弱了,但对于一些问题性价比更高。 第一种: 单点更新 区间求和 单点更新:修改数组中..原创 2021-08-06 19:36:17 · 786 阅读 · 0 评论
分享