# 一些小小的思考方式 ## 起因 基本上各位已經快要把基礎的演算法都學完了,大概如下 - 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**