首页 > 其他分享 >一些板子

一些板子

时间:2024-02-21 16:00:23浏览次数:21  
标签:int top dfs 板子 ++ cppvoid 一些 dp

**本博客由[@Nihachu](https://www.luogu.com.cn/user/1109610#main)的博客~~抄袭~~搬运而来**

(绝大部分代码来自[@Nihachu的博客](https://www.luogu.com.cn/blog/Nihachu-33/mu-ban-ji-he)~~若有侵权,就算联系我也不会删除~~)

一、二叉树相关:

1、深度优先:

前序遍历(根,左子树,右子树)

```cpp
void dfs(int x){
printf("%d\n",x);
if(ls[x]) dfs(ls[x]);
if(rs[x]) dfs(rs[x]);
}

```

 

中序遍历(左子树,根,右子树)

```cpp
void dfs(int x){
if(ls[x]) dfs(ls[x]);
printf("%d\n",x);
if(rs[x]) dfs(rs[x]);
}
```

后序遍历(左子树,右子树,根)

```cpp
void dfs(int x){
if(ls[x]) dfs(ls[x]);
if(rs[x]) dfs(rs[x]);
printf("%d\n",x);
}
```

2、广度优先:

层次遍历(从上到下,从左到右依次输出同一层的节点):

```cpp
void bfs(int x){
q[++top] = x;
for(int i = 1; i <= top; i ++){
int now = q[i];
printf("%d\n",now);
if(ls[now]) q[++top] = ls[now];
if(rs[now]) q[++top] = rs[now];
}
}
```

二、动态规划相关:

1、01背包(已降维)

```cpp
for(int i = 1; i <= n; i ++){
for(int j = m; i >= w[i]; j --){
dp[j] = max(dp[j],dp[j - w[i]] + v[i]);
}
}
```

2、完全背包
```cpp
for(int i = 1; i <= n; i ++){
for(int j = w[i]; i <= m; j ++){
dp[j] = max(dp[j],dp[j - w[i]] + v[i]);
}
}
```
3、背包计数
```cpp
for(int i = 1; i <= n; i ++){
for(int j = m; i >= w[i]; j --){
dp[j] += dp[j - w[i]];
}
}
```
(若要求恰好为m,则dp[0]初始化为1,其他均为0);

4、二进制拆分(用于多重背包)
```cpp
for(int i = 1; i <= n1; i ++){
scanf("%d %d %d",&a, &b, &c);
for(int k = 1; k <= c; k <<= 1){
v[++u] = k * a; w[u] = k * b;
c -= k;
}
if(c) v[++u] = a * c,w[u] = b * c;
}
```
三、卡时间相关

1、快读
```cpp
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
```
2、快写
```cpp
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
```
3、手动o2优化
```cpp
#pragma GCC optimize(2)
```
四、并查集

1、查询 + 路径压缩
```cpp
int find(int x){
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
```
2、合并x,y所属集合
```cpp
void marge(int x, int y){
int u = find(x), v = find(y);
if(u == v) return;
fa[u] = v;
}
```
3、合并x, y 所属集合(按秩合并)
```cpp
void marge(int x, int y){
int u = find(x), v = find(y);
if(u == v) return;
if(rk[u] > rk[v]) swap(u,v); // 把深度小的合并到深度大的上面;
fa[u] = v;
rk[v] += rk[u] == rk[v]; //如果同级,则合并后深度加一,否则不变;
}
```
五、单调队列
```cpp
//n为数据个数,m为窗口长度;
for(int i = 1; i <= n; i ++){
if(q[head] <= i - m) head ++;
while(head <= tail && a[q[tail]] < a[i]) tail --;
q[++tail] = i;
ans[i] = a[q[head]];
}
for(int i = m ; i <= n ; i ++){
//对每个窗口中已选出的数据进行处理 ;
}
```
六、图论

1、链式前向星
```cpp
void add(int x, int y){
to[++cnt] = y;
nxt[cnt] = head[x];
head[x] = cnt;
}
```
2、图的dfs遍历(以链式前向星为例)
```cpp
void dfs(int x) {
vis[x] = 1;//状态更新为已访问
printf("%d ",x);//输出
for(int i = head[x];i;i = nxt[i])//找到所有x能到达的点与x之间的边的编号
if(!vis[to[i]]) {//如果该点未访问过
dfs(to[i]);//访问该点
}
```
3、tarjan求scc(强连通分量)
```cpp
/*
timestamp:时间戳
scccnt:当前强连通分量编号
sccid[u]:编号为u的节点所在的强连通分量的编号
stk:栈
top:栈顶
in[u]:编号为u的节点是否在栈内
sccsize[u]编号为u的节点所在的强连通分量的大小
*/
void tarjan(int u) {
low[u] = dfn[u] = ++timestamp;
in[u] = 1;
stk[++top] = u;
for(int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(in[v]) low[u] = min(low[u],dfn[v]);
if(low[u] == dfn[u]) {
scccnt++;
while(stk[top] != u) {
sccid[stk[top]] = scccnt;
in[stk[top]] = 0;
sccsize[scccnt]++;
top--;
}
sccid[stk[top]] = scccnt;
in[stk[top]] = 0;
sccsize[scccnt]++;
top--;
}
}
}
```
七、数据结构

1、树状数组

2、线段树

标签:int,top,dfs,板子,++,cppvoid,一些,dp
From: https://www.cnblogs.com/viki617/p/18025451

相关文章

  • 我们在SqlSugar开发框架中,用到的一些设计模式
    我们在《SqlSugar开发框架》中,有时候都会根据一些需要引入一些设计模式,主要的目的是为了解决问题提供便利和代码重用等目的。而不是为用而用,我们的目的是解决问题,并在一定的场景下以水到渠成的方式处理。不过引入任何的设计模式,都会增加一定的学习难度,除非是自己本身领会比较好了,......
  • 模板匹配里的一些数学原理
    模板匹配里的一些数学原理我们知道,在openCV里,模板匹配中匹配度的计算公式有三类。SQDIFF、CCORR、CCOEFF。下面我们来简单介绍一下这三类计算方法,并比较其不同之处。openCV里的模板匹配SQDIFFSQDIFF全称SumofSquaredDifference(SSD),即差的平方和。其离散形式为:\[E(\v......
  • 给 PyQt5 登录添加记住用户密码功能,并优化一些内容
    使用PyQt5(PySide2)+SQLAlchemy做一个登录注册页(七)本文将介绍自己用PyQt5+SQLAlchemy做的一个登录注册页,使用邮箱接收验证码,本文介绍是前后端未分离的实现方式,后续将出一个前后端分离的,你可以将PyQt5改为PySide2以获得更宽松的开源协议本文由于涉及到的代码较多,将会是一......
  • 关于信息学奥赛中的一些做题思路
    观前须知鼠鼠我啊,非常非常的菜呢如有错误,感谢各位大佬指出本文只包含笔者在比赛过程中总结的一些比赛思路不全面,也不一定正确请多多包涵喵~本文持续更新正片暴力(枚举暴搜模拟)暴搜剪枝出奇迹乱搞做法出奇迹通过数据规模猜测算法复杂度进而推出算法通过归纳总结性质对......
  • 2024年,提升Windows开发和使用体验的一些实践 - 包管理器篇
    前言短暂的春节假期转瞬即逝,忙碌的一年又要开启了......
  • 一些关于 OI 好玩(玄学)的事
    算法:\(Bellman-fold\)在某些情况下可以跑得比\(SPFA\)快\(SPFA\)可以跑\(dfs\),并且继承了\(bfs\)版本的玄学特性strcmp比较两个字符数组的大小是基于长度相等的基础之上的字符串比较函数不同是返回正/负(>/<)值的,并不是1/-1人文:伟大的衡中OJ评测机在以前......
  • 一些题的思路
    懒得写代码了1.http://oi.nks.edu.cn/zh/Problem/Details?cid=2719&tid=F 首先有个单次询问O(n)的换根DP做法。像这种每次找一类点计算答案的题,考虑虚树。有个结论:相遇点选在颜色为x或y的点上不会更劣所以只需要在同时包含x和y色的虚树上换根DP就行了但复杂度波动不定。当ma......
  • 设计模式之美学习-一些反思
    系统的看完各个设计模式,和开闭原则,实际中其实往往想不到如何使用比如业务场景,通过redis来模拟延迟消息处理还是采用传统思维模式写入消息//离线列表延迟一分钟redisOperationService.zaddWithPrefix(BusinessRedisKeyDefinition.SESSION_STATE_OFFLINE_QUEUE......
  • 线段树(板子)
    线段树单点修改,单点,区间查询区间修改,单点,区间查询单点修改普通线段树code#definels(rt<<1)#definers(rt<<1|1)#definellllonglongconstintN=1000001;intn,m;inta[N];structT{ intl,r,data;}tr[N<<2];voidpushup(intrt){ tr[rt].da......
  • 2024,立一些flag
    关于2023进入了一些新的领域ANC:前半年一直再弄ANC,折腾折腾,好不容易原理搞懂,有了初步的优化结果,结果公司砍了需求,感觉现在处于半吊子水平。没有需求也没有理由去深入,就此搁置。nnAEC:后面做了nnAEC的数据增强,借助这个项目,对整个AEC的处理流程和某些卡喉的难点(非线性失真,延时抖动)......