首页 > 其他分享 >OI 模板合集

OI 模板合集

时间:2023-07-27 09:34:07浏览次数:29  
标签:OI vis int cin else ## 合集 模板 op

此处存放本蒟蒻写过的各种 cpp 模板,不喜勿喷~

# 目录
- 基本算法
- 前缀和
- 差分
- 二分答案
- 基本数据结构
- 栈
- 队列
- 搜索
- 图上深度优先遍历
- 图上广度优先遍历

# 基本算法

## 前缀和

```cpp
for (int i = 1; i <= n; i ++) {
cin >> arr[i];
sum[i] = sum[i - 1] + arr[i];
}
```

## 差分

```cpp
for (int i = 1; i <= n; i ++) {
cin >> arr[i];
dif[i] = arr[i] - arr[i - 1];
}
```

## 二分答案

```cpp
int l = 0, r = 1e9, ans = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (check(mid)) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
```

# 基本数据结构

## 栈

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
int T;
cin >> T;
while (T--) {
vector<unsigned long long> st;
int n = 0;
cin >> n;
for (int i = 1; i <= n; i ++) {
string op;
unsigned long long x;
cin >> op;
if (op == "push") {
cin >> x;
st.push_back(x);
} else if (op == "query") {
if (st.size() != 0) {
cout << st.back() << endl;
} else {
cout << "Anguei!" << endl;
}
} else if (op == "size") {
cout << st.size() << endl;
} else if (op == "pop") {
if (st.size() != 0) {
st.pop_back();
} else {
cout << "Empty" << endl;
}
}
}
}
return 0;
}
```

## 队列

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
int N = 0;
cin >> N;
queue <int> q;
while (N--) {
int op = 0;
cin >> op;

if (op == 1) {
int x = 0;
cin >> x;
q.push(x);
} else if (op == 2) {
if (q.size() == 0) {
cout << "ERR_CANNOT_POP" << endl;
} else {
q.pop();
}
} else if (op == 3) {
if (q.size() == 0) {
cout << "ERR_CANNOT_QUERY" << endl;
} else {
cout << q.front() << endl;
}
} else {
cout << q.size() << endl;
}
}
return 0;
}
```

# 搜索

## 深度优先搜索

```cpp
// 暴力枚举所有方案(伪代码)
void dfs(int n, ...) {
if (所有状态均枚举完成) {
...
return; // 一定要返回
}
for (遍历当前状态所有扩展可能性) {
if (判断扩展状态是否合法) {
调整状态
dfs(n + 1, ...); // 向深层递归搜索
复原状态(一定要回溯!!)
}
}
}
```

## 图上深度优先遍历

```cpp
// 用 vis 数组跳过已经走过的点(伪代码)
void dfs(int u) { // 当前的位置(节点)
vis[u] = 1;
for (与 u 相邻的节点 v) {
if (!vis[v]) dfs(v);
}
}
dfs(s); // 从起点开始
```

## 图上广度优先遍历

```cpp
// 使用队列(伪代码)
void bfs() {
queue<T> q;
q.push(s); // 起点入队
vis[s] = 1;
while (!q.empty()) {
T u = q.front();
q.pop();
for (与 u 相邻的节点 v) {
if (!vis[v]) {
q.push(v);
vis[v] = 1; // 必须在此处标记,避免某节点多次入队
}
}
}
}
```

## bfs 走迷宫

```cpp
#include <iostream>
#include <string>
#include <queue>
using namespace std;
int n, m;
string maze[110];
bool vis[110][110];
int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
bool in(int x, int y) {
return 0 <= x && x < n && 0 <= y && y < m;
}

struct node {
int x, y, d;
node(int xx, int yy, int dd) { // 构造函数
x = xx;
y = yy;
d = dd;
}
};

int bfs(int sx, int sy) {
queue<node> q;
q.push(node(sx, sy, 0));
vis[sx][sy] = true;
while (!q.empty()) {
node now = q.front();
q.pop();
for (int i = 0; i < 4; i ++) {
int tx = now.x + dir[i][0];
int ty = now.y + dir[i][1];
if (in(tx, ty) and maze[tx][ty] != '*' and !vis[tx][ty]) {
if (maze[tx][ty] == 'T') {
return now.d + 1;
} else {
vis[tx][ty] = true;
q.push(node(tx, ty, now.d + 1));
}
}
}
}
return -1;
}

int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> maze[i];
}
int x, y;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maze[i][j] == 'S') {
x = i, y = j;
}
}
}

cout << bfs(x, y) << endl;
return 0;
}
```

## 双向 bfs

```cpp
// (伪代码)
将 起始状态 和 目标结点 入队

标记起始结点为 1
标记目标结点为 2

while(队列不为空)
{
从队首扩展出新个结点

如果 新扩展出的结点已经被其他数字标记过,表示已经搜索到了一种方案,算法结束。

如果新个结点是从起始状态扩展来的,那么将这个该结点标记 1 并入队

如果新个结点是从目标结点扩展来的,那么将这个该结点标记 2 并入队
}
```

# 数据结构进阶

# 动态规划

标签:OI,vis,int,cin,else,##,合集,模板,op
From: https://www.cnblogs.com/winter-tide/p/17584077.html

相关文章

  • NOI2023 最后一战记
    7.20出发!似乎南京天气不太好,本来18:50的航班延误到22:20,最后只能在机场干等三小时。飞机到1:00才到目的地,合着算两点多才找到地方住。7.21上午继续补题解,晚上来了点小小的川菜震/撼。睡觉前打generals.io1v1碰到了Kubic,和他打了半个小时左右就睡了。7.22上午实在......
  • NOI 2023 垫底记
    垫底过程:(无声胜有声,咕咕咕咕咕)......
  • 最短路模板总结
    最短路单源最短路所有边权都是正数朴素版Dijkstra算法(适用于稠密图)堆优化版Dijkstra算法(适用于稀疏图)存在负权边Bellman_Ford算法,用于仅存在负权边,并且对边数有限制Spfa算法对Bellman_Ford算法进行优化(容易被卡死)多源汇最短路可能不止一个起点,有很多询问,求任意......
  • C++中的模板
    1.概念模板是对类型的抽象,为了更好的实现多态的思想。模板分为类模板和函数模板。2.函数模板就是在函数之前声明一下模板,然后执行的时候,函数自行判断推导类型。intadd(inta,intb){returna+b;}doubleadd(doublea,doubleb){returna+b;}//如a......
  • vue指令及模板语法
    说实话,看了这两节之后,改变认知的,突然发现自己落后了这么多,真不应该v- 这个指令集的确666,把许多东西的实现简化了,真心学到了不少,菜鸟这方面讲的真是不错https://www.runoob.com/vue3/vue3-directives.html我在这就不献丑了,而且里面的各种试例的可运行代码环境我非常喜欢,可以......
  • c++ std::thread::joinable
    std:......
  • P3704 [SDOI2017] 数字表格 题解
    一、题目描述:用$f_i$表示斐波那契数列的第$i$项,那么有:$f_0=0,f_1=1;f_n=f_{n-1}+f_{n-2},n\ge2$现在有一个$n$行$m$列的数字表格,第$i$行第$j$列的数字是$f_{\gcd(i,j)}$。求这个表格所有数的乘积。共有$T$组数据,答案对$10^9+7$取模。......
  • noi2023 游记
    ?~7.1学考。7.2晚上打了把arc。F原题过了。找了一整场E的规律,最后找出来一个奇怪的东西/oh。7.3联考是我的模拟赛。去武汉。7.4早上模拟赛t1跑两次km没清空,t3没写完。晚上感觉很困,想先去开场div2练练手。先打开了个div2的f,看了会儿突然发现怎么d2F=d1D!!于......
  • NOI 2023 录
    是不是没进集训队不配写回忆录啊,那就摆了吧。Day1我还是难以理解,我是怎样打出100+15+0的好成绩的。也许是因为T1复杂做法调了2.5h才过;也许是因为T2不会找规律也不会正经的dp转移顺序50分m^3暴力还写挂;也许是因为T3从头读错题面到最后也没写出一个正确的低分暴......
  • NOI2023 游记
    把前面的复习实况删了,因为实在太摆了!前面在cdqz训了两场模拟赛,垫了两场底!!熟悉了下cdqz键盘,能打。Day0报道日。由于是第一个进去了,被拉着生产了很多照片/采访,开幕式好像重复利用了很多遍这些素材。领到了很多徽章,拉着学弟主动social了很多老哥!!虽然最后还是没有juju......