# 天梯赛备赛经验（细节篇)

## 天梯赛L1,L2的常考考点：
L1：

输入输出、字符串处理
简单数学：整除、取余、最大公约数、最小公倍数、素数判断
简单循环、条件判断
结构体/简单排序
水题占比极高，不卡算法，只卡细心

L2：

基础数据结构：栈、队列、链表、二叉树遍历
排序、二分查找
简单图：连通性、最短路（Dijkstra 简化版）
简单递归 / 暴力枚举
模拟题（逻辑长，但不难）
需要注意的细节处理：
天梯赛的基础题不难，但是有的时候可能卡在细节处理上，比如赋值，数值溢出，越界访问等细节，导致一些案例WA，下面是我总结的比较容易犯错的几个点还有需要记住的细节。

## vector数组的插入:
在写vector数组进行读取数值的操作的时候，需要注意有没有一开始就给数组开辟了空间，如果已经开辟了空间，直接用下标，如果没有，用push_back()。因为有可能出现你已经开辟了空间，但是写入数据使用的是push_back(),这样你取出来的数据就有可能不对。

你可能觉得没什么，但是有时候脑子一热就有可能写错，检查的时候却反应不过来，所以最好养成这样一个习惯。

## 栈的读取：
注意在读取栈中的元素时一定要确保栈是非空的，否则程序会出错，每次写一句!st.empty()总是没有问题的，多一重保险嘛。

## string字符串的常用操作（常考）：
string是天梯赛的常考知识点，所以下面的常见操作一定要掌握：

以string s="hello"为例

**1.清空字符串：s.clear()**
**2.插入/删除：**
插入：s.insert(2,"xx"),表示在索引2前面插入字符串“xx"

删除：s.erase(2,2),表示从索引2开始删除两个字符

**3.访问字符：**
s.front()/s.back()，分别为访问第一个和最后一个字符

**4.查找:**
int pos=s.find("h"),find函数返回字符的索引，如果字符串中找不到这个字符，则返回string::npos

**5.分割空格：**
分割空格操作：

下面是分割字符操作的代码模板，考试时可以直接写;
```cpp
vector<string> parts;//parts里存的是分割的字符串
string temp;
stringstream ss(s);
while(ss>>temp){
parts.push_back(temp);
}

```

#### 6.分割指定字符，如！,&等 
我们将这些字符记为delim，函数模板如下;
```cpp
vector<string>split(string& s,char delim){
    vector<string> parts;//parts里存的是分割的字符串
    string temp;
    stringstream ss(s);
    while(getline(ss,temp,delim)){
    parts.push_back(temp);
    return parts;
}
```

##### 还有要注意的一点是，如果你用cin>>s;那么程序在读取到空格后会终止的，如果你想要读取含有空格的字符串，例如"hello world",需要用getline(cin,s);

还有在使用getline时，最后看一下前面是否有空行，若有需要用cin.ignore()，否则就算你用了getline，也读取不了字符串


## 优先级队列：
天梯赛考优先级队列考的也相对较多，下面是优先级队列的几个模板。

优先级队列默认是大顶堆，小顶堆的写法如下：

priority_queue<vector<int>,vector<vector<int>>,greater<vector<int>>heap;

那如果我想要自定义比较函数呢？也很简单，priority_queue的模板如下：

priority_queue<元素类型，底层容器，比较函数>

例如;其中cmp是自定义比较函数，

priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)>heap(cmp);

## 总结：
好了，要说的就这么多了，其实天梯赛想要拿100+还是很容易的，注意一下细节不要犯错就可以了，但是想要拿到高分还是要多练算法。
