---
# System prepended metadata

title: 一些小小的思考方式

---

# 一些小小的思考方式


## 起因

基本上各位已經快要把基礎的演算法都學完了，大概如下

- DP
- Greedy
- binary search
- dfs/bfs
- Divide and conquer
- math
- bst


剩下沒有學過得可能是
- binary tree( segment, BIT)
- shortest path
- dsu/mst

這樣子應該就算是把基礎的演算法都過一遍了，
亦即沒有意外的話 <del>要出意外了</del>，
各位的APCS的分數實作``4-5``級分應該是沒有問題？
只要有好好的理解他在做什麼的話?

那學完基礎演算法的各位之後要做什麼呢？
這邊提供兩種路？

一個是打競賽 :poop: 就如同字面意思，如果想要打競賽的話基本上這樣還不太夠？
我們可能還需要一點點的小小超修，也沒有很多，就多接觸一些演算法就好了，主要會是上面的延伸or加強板之類的，還有一些神奇的東西，基本上我在競賽還沒有用到不是上面的東西 <del>用到可能也忘了</del>，但如果想要超過我的話就需要更多東西了，順帶一題，因為復旦是**不被承認的資優班**，所以我們跟其他普通高中一樣只能派出少少的人，像是復旦只能有兩個 :poop: 


第二個是走 APCS ，反正不管如何可能都需要走一下就是了，它蠻好考的？可能只有筆試會難一點（會有許多神奇的程式邏輯跟指標），然後**賽後judge**是真的很狠心，不過基本上進階班都不會太差？

那這節課主要想要講的是他們共通的性質 <del>都要打code</del> 都要想到怎麼使用，所以這邊就稍微總結一下我的經驗。(雖然我沒進二階就是了 :poop:)，期待後年就是國手回來講了。

## 圖像化可能是一個好東西 

這個可能比較偏個人特長？但是我本人會比較喜歡把複雜的文字想像成圖片，像是如果是取mod的話我就會把它想像成一個有限制長度的陣列之類的，然後二元樹那些就不用多說，merge sort 的話就像畫在黑板上的圖片，不果我思考時候就使會有三個陣列`當前的`, `左邊`, `右邊`，， 我覺得這樣可以更好思考。

有時候也可以透過如此讓實作變得簡單一點。
:::spoiler 順帶一題
我dp 式通常不會想成二維陣列，我更偏好用狀態來想，因為dq式子也許很多維度，我不會想像四維陣列 :poop:
:::

## terminal 
```
g++ -fsanitize=address -Wall -g code.cpp -o run
```

- `fsanitize=address` 偵錯，ex: RE
- `-g` 讓出錯的時候可以顯示出錯在哪裡
- `Wall`編譯的時候偵錯


```
g++ -fsanitize=address,undefined,leak -Wall -Wextra -Wfatal-errors -g code.cpp -o run
```

## 正向思考？反向思考？

這個可能算很基本的思考法，有時後有些題目正著做很難，但倒著做就會變得很簡單，一個簡單的例子是把**刪除想像成加入**，這樣有些題目就會很簡單 :poop: 
ex: [水庫危機](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a612)

## 把思考範圍縮小
有時候有些題目可能很多條件，很麻煩，這個時候不如從最簡單的條件開始想，也許會有一點收穫。
抑或著我們可以指先關注某一個局部的解，然後看他的**性質**。

要不然也可以手動的把題目先便簡單一些，這樣也可以幫助大腦快速的抓到性質。

ex: 最小包覆k點圓

## 性質很重要

對於難的題目，其實只要發現某些特別的**性質**之後就會發現它變得很簡單，通常題目也都會給一些些線索？因為可以透過範圍來猜抑或著是題目限定的條件之類的

ex: [第k小區間和](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a121)

## 注意總狀態數

有時候好好的注意總狀態數或許就會發現其實可以報搜？
在多發現一點點性質就可以AC了

ex: **TOI 2023 一模pA**



