基础数据结构 学习笔记
1. 栈
1.1 栈的性质
后进先出。
1.2 栈处理括号序列
一个栈,遇到左括号压入栈,遇到右括号判断栈顶是否为左括号,如果是则弹出栈顶,否则不合法。
bool flag=1; for(int i=0; i<s.size(); i++) { if(s[i]=='(') st.push(s[i]); else if(st.top()=='(') st.pop(); else flag=0; } if(st.size()) flag=0; puts(flag?"YES":"NO"); return 0;
1.3 单调栈
单调队列平替。例如维护一个顶小的单调栈,插入
2. 队列
2.1 队列的性质
先进先出。
2.2 单调队列
维护一个头小尾大的单调队列,插入
int head=1,tail=0; //in a[x] while(head<=tail && a[q[tail]]>a[x]) tail--; q[++tail]=x; while(head<=tail && x-q[head]>=t/*不满足条件*/) head++;
3. 并查集
值得注意的是路径压缩会破坏树的形态。
struct easy_dsu { int fa[maxn]; int find(int x) { while(fa[x]^x) x=fa[x]=fa[fa[x]]; return x; } void init(int n) { for(int i=1; i<=n; i++) fa[i]=i; } void merge(int x,int y) { int rx=find(x),ry=find(y); fa[rx]=ry; } bool query(int x,int y) { return find(x)==find(y); } }; struct size_dsu { int fa[maxn],sz[maxn]; int find(int x) { while(fa[x]^x) x=fa[x]; return x; } void init(int n) { for(int i=1; i<=n; i++) fa[i]=i,sz[i]=1; } void merge(int x,int y) { int rx=find(x),ry=find(y); sz[ry]+=rx; fa[rx]=ry; } bool query(int x,int y) { return find(x)==find(y); } }; struct dis_dsu { int fa[maxn],dis[maxn]; int find(int x) { if(fa[x]!=x) { int y=find(fa[x]); dis[x]+=dis[fa[x]]; fa[x]=y; } return fa[x]; } void init(int n) { for(int i=1; i<=n; i++) fa[i]=i,dis[i]=0; } void merge(int x,int y) { int rx=find(x),ry=find(y); fa[rx]=ry; } bool query(int x,int y) { return find(x)==find(y); } }; struct merge_by_rank { //不会破坏树的形态 int fa[maxn],rk[maxn]; int find(int x) { while(fa[x]^x) x=fa[x]; return x; } void init(int n) { for(int i=1; i<=n; i++) fa[i]=i,rk[i]=0; } void merge(int x,int y) { int rx=find(x),ry=find(y); if(rx^ry) { if(rk[rx]<rk[ry]) fa[rx]=ry; else if(rk[ry]<rk[rx]) fa[ry]=rx; else fa[rx]=ry,rk[ry]++; } } bool query(int x,int y) { return find(x)==find(y); } };
4. hash 表
给一个数处理一个 hash 值,有奇妙的用处。
考虑如果一段区间合法,那么你对每个数值进行哈希,这段区间哈希值的和必定是
对每个数hash一下,暴力匹配。
5. 链表
实现相邻访问
6. ST表
一个很像 dp 的数据结构,可以做到
以P3865 为例。
设
那么可以得出状态转移方程
那么可以
考虑查询:可以直接查询
最小值同理。
同样,我们也可以维护区间 gcd,因为 gcd 重复算肯定是可以的。P1890
本文作者:lgh_2009
本文链接:https://www.cnblogs.com/lgh-blog/p/18042777
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步