Problem
是否存在 weak link,使得兩個 component 會因為 weak link 斷掉而無法連通。
Sample Input
|
|
Sample Output
|
|
Solution
找橋 bridge!利用 back edge 的深度進行判斷。
|
|
是否存在 weak link,使得兩個 component 會因為 weak link 斷掉而無法連通。
|
|
|
|
找橋 bridge!利用 back edge 的深度進行判斷。
|
|
問是否計算順序會影響結果,給一個有向圖,請問是否每一個操作都會 reduce 到同一個項目。
|
|
|
|
如果裡面有環肯定是不行的,因此需要偵測環是否存在。
在這之後,必須檢查是否會 reduce 到同一個項目,因此我們將每個 node reduce 的結果保存,之後取聯集,如果發現 reduce 項目超過一個則直接回傳失敗。
|
|
紅圓茵可最近隱居在板擦山研究魔法師的夢想,傳說中的魔法-「召喚蘿莉」。
只要成功練就這個魔法,茵可就可以召喚出一堆蘿莉,然後跟一堆蘿莉一起……嘿嘿嘿…..
目前茵可已經研究出N種可能可以成功魔法陣,接下來就是要測試這些魔法陣能不能成功召喚蘿莉,因為數量實在太多了,所以他決定先測試其中K種。為了測試魔法陣,茵可需要先開一個異次元空間,並且在裡面做測試(因為召喚蘿莉是個極大的魔法,發動時可能會造成空間扭曲,不小心毀掉可茵城就不好了。)。魔法陣都是圓形的,半徑為r,發動一個魔法陣需要以魔法陣為底高度為h的圓柱體空間。而茵可只能開出長方體的異次元空間,一個異次元空間有其長、寬、高,而魔法陣只能放置在該空間的地板上(長 x 寬那一面),所以要發動一個半徑為r,高度為h的魔法陣,茵可需要開一個長2r寬2r高h的異次元空間(體積2r x 2r x h)。現在茵可想要開一個異次元空間,而這個空間至少要能發動K個魔法陣(不必同時發動),這個空間的體積至少是多少。
第一行有兩個正整數 N,K(K<=N)
接下來N行每行有兩個正整數r,h代表一個魔法陣的半徑及發動需要高度(r,h<=100)
測資
輸出要發動其中K個魔法陣所需最小的異次元空間的體積是多少
|
|
|
|
範測所需體積為 224=16
可發動第1、2、5個魔法陣
這一題有兩種做法,直接窮舉 O(100 * 100)
的針對 [r, h]
找到 [0, r] x [0, h]
的數量是否大於 K,那麼可以在線性時間內完成。
而下面的做法,算是多此一步,原本想說能不能用 O(n log n)
時間內完成,但是會缺少部分調整資訊,也就是單純排序,以掃描線的基準會漏到資訊。
如果這一題的 r, h 很大的話,窮舉還是會耗費 O(n^2 log n)
,套用當前最佳解剪枝應該快上很多。
|
|
「哇!我終於解出來啦!咦?茵可呢?」剛解完K大數字差的你,在茵可家到處尋找,卻始終不見紅圓茵可的身影。
四處打聽之下,得知茵可前往神秘之山-「板擦山」修練神秘的魔法去了。板擦山本身有天然的結界,只有法力高強的魔法師才有辦法進入山中。「這下子我該怎麼找到茵可呢?」你苦思著,「想找茵可嗎?我可以告訴你怎麼找到茵可!」似乎是剛好路過的長頸鹿這麼說道。
板擦山的山腳下有好幾間便利商店,這些便利商店剛好開在結界外,茵可每天都會到山下的其中一間購買民生用品,而且到哪家便利商店是可以預測的。板擦山上有N個點,每個點有各自的編號,越高的點編號越小,點跟點之間有道路連接,茵可所在的山頂為編號0的點,便利商店也是其中的一個點。茵可每天會由山頂出發,經過一些點後到山下的便利商店買東西。當茵可走到一個點x後,他會先走跟x有連接的點中,編號比x大(當然要往山下走阿)的點中,編號最小的那一個。而下一次又到x時就走第二小的,直到編號比x大的點都走過一次,就會回到最小的點繼續走。(假設 3號點連到 1,4,5,第一次到3時,茵可會走向4。下一次到3時,茵可會走向5。再下一次到3時,茵可會走向4。)若一個點沒有連到編號比它大的點,則該點為便利商店。
你從長頸鹿手中的到了板擦山的地圖,你就可以預測茵可在第K天時會走到哪一家便利商店了!
第一行有兩個正整數N,M,K,表示有N個點(編號0~N-1)、M條邊(M<=N*(N-1)/2)及詢問第K天茵可會到哪個點。
接下來M行每行有兩個整數a,b表示a跟b間有一條邊(保證同樣兩個點間只會有一條邊)。
測資
輸出第K天時茵可會走到哪個點。
|
|
|
|
範例測資
第一天 0→1→2→3
第二天 0→2→3
第三天 0→4
第四天 0→1→4
一開始曲解題目了,不過沒關係。
首先讓我們來了解多久一循環,根據公式$cycle(u) = \sum cycle(v) | u \rightarrow v$,這個很容易理解的,事實上 cycle(0) 可能很大派不上用場。
如果試圖用週期 M 天,則期望用模擬迭代到 M 天是否與第一天相同,則很容易在 M + 1 天不會與第二天相同,因為路徑相同不代表狀態相同。
藉此我們利用動態規劃的概念,來找尋狀態的基底位置。
|
|
身為魔法師的你,想讓自己變得更強大,於是前來膜拜紅圓茵可,同時想請教他學習魔法的秘訣。經過日復一日的嘗試,你終於通過了柏油路,並且來到茵可家。「看在你這麼努力的份上,我就稍微指導你一下吧。」茵可說道。「所謂魔法,跟程式設計很像,就是一堆指令的結合。將分子移動、放熱、發光等等基礎的小魔法結合在一起,就會變成強大的魔法(像是防護罩就是控制空氣分子的移動,並使其重新排列成為堅固的結構,達到防禦的效果。)。所以說,腦中運算的能力是很重要的。」語畢,茵可大大丟給你一個題目:
給你N個數字,挑出其中兩個數字可以得到一個數字差(非負),而N個數字會有N*(N-1)/2個數字差,問第K大數字差是多少?
如範例輸入,數字差有6個,分別為9(10-1)、7(8-1)、5(10-5)、4(5-1)、3(8-5)、2(10-8),其中第5大的是3。
「等你能在1秒內解完這個問題再來找我吧!」隨後茵可打開比較大的門走掉了。
第一行有兩個正整數N,K
接下來有N個整數(0<=每個整數<=1,000,000,000)
測資
輸出第K大數字差
|
|
|
|
使用二分搜索答案,通常是查找第 K 小的元素,這題是換成第 K 大元素,那麼就反過來找,中間調校的時候要特別小心。
代碼效率是 O(n log^2 n)
,事實上可以壓成 O(n log n)
,因為中間的索引值肯定是單調的,不過要考慮組合問題,特別要小心同一個元素自減的結果。由於懶得判斷,複雜度高了點還是過了。
|
|
相信大家都知道紅圓茵可是誰,就不多介紹了。最近他有一個煩惱,身為一位大魔法師,每天都有成千上萬的人來膜拜他<( )>。因為人數實在太多了,這麼多人跑到他家膜拜他,害他都無法好好練習魔法了。茵可家門前有一條柏油路,要到他家一定得經過這條柏油路,他決定把這條柏油路(長方形)切成N*M個格子,並且在其中某些格子設下陷阱,踩到陷阱的人會被傳送回柏油路的起點。「恩~這樣子就可以減少膜拜我的人了~」紅圓茵可心想。但是,為了讓jackyXX等人可以到達他家,也不能把柏油路封死,必須確保一定有條路徑可以走到茵可家。而你的任務是要提醒茵可大大<( )>,哪些點能放陷阱,而哪些點不能放陷阱(導致道路封死)。
柏油路的起點在左邊,而茵可家在柏油路的右邊。一個人在柏油路上只能往上下左右四個方向走,不能走斜對角。
一條3*10的柏油路
oooooooooo
oooooooooo
oooooooooo
一條被封死的柏油路
ooooxooooo
oooxoooooo
ooxooooooo
一條沒被封死的柏油路
xxxxxxoooo
oooooxoxxx
ooxxoooxoo
第一行有3個正整數N、M、T,T為茵可接下來要放的陷阱數量(0<T<=N*M)。
接下來T行每行有2個非負整數x,y表示這個陷阱要放的位址。
縱軸為x軸,橫軸為y軸,左下角那格為(0,0)。
保證一個點只會被放最多一次。
測資
對每一個要放的陷阱,若該點可放,請輸出一行”<( )>”(不含雙引號),並且把陷阱放上去。
若該點不可放(會導致道路封死),請輸出”>_<”(不含雙引號),並且不放該陷阱。
|
|
|
|
這一題相當活用并查集的概念,雖然題目問說是否能左右相連,但是反過來則是上下邊界是否會從不相連變成相連。
多設兩個虛點,我們假想所有上界點都與虛上點相連,下界點都與虛下點相連,每次一次加入一個障礙物時,檢查九宮格內是否會造成上下虛點相連,這裡必須先偷看并查集的結果,隨後在考慮是否將其相連。
|
|
每一步轉角九十度,並且第 i 次要走 i 長單位,回到原點且沿途不經過障礙物,同時轉角不可重複。
|
|
|
|
沿途經過障礙物,同時轉角不重複。一開始曲解了經過的轉角點,以為他也不能在隨後中經過,但實際上是可以的,因此拿了不少 WA。
|
|
每個 * 位置,可以任意替換成任何字串或者是空字串,是問是否有可能匹配主字串。
|
|
|
|
以 * 劃分,將其切割成好幾個 token,根據貪心原則只要按照順序出現這些 token 即可,因此盡可能靠左。
|
|
對一個已經是 Chomsky normal form 的 CFG,問一個 string 是否在 CFG 之中。
|
|
|
|
因為 chomsky normal form 恰好劃分成兩個,定義字串 dp[l][r]
中可以解析出那些 nonterminal,藉由矩陣鍊乘積的方式,將其組合。最後檢查整個字串是否可以推回 start symbol。
|
|
The convex hull of a set S is defined to be the intersection of all convex sets that contain S. For the convex hull of a set of points it was indicated that the convex hull is the convex set with smallest perimeter. We want to show that these are equivalent definitions
a. Prove that the intersection of two convex sets is again convex. This implies that the intersection of a finite family of convex sets is convex as well.
b. Prove that the smallest perimeter polygon P containing a set of points P is convex.
c. Prove that any convex set containing the set of points P contains the smallest perimeter polygon P.
a. 證明兩個凸包交集仍然是凸包
假設凸包分別為$C1, C2$,題目所求$C = C1 \bigcap C2$
已知:A set$K$ is convex if each$u \neq v$, the line-segment$\bar{uv}$ is contained in$K$,$\bar{uv}\subseteq K$
假設$C$ 不是凸包,則存在$\bar{uv} \nsubseteq C$,根據定義$u, v \in C1, C2$,得到$\bar{uv} \nsubseteq C1, C2$,矛盾得證$C$ 一定是凸包。
b. 證明最小周長的多邊形 P 包含所有點集 S 一定是凸包
假設$P$ 是最小周長的非凸包多邊形,令$x, y \in P, and \bar{xy} \nsubseteq P$,則$\bar{xy}$ 會交$P$ 於至少兩點$x', y'$$P'$ 是將$\bar{x^{'}y^{'}}$ 連起所產生的新多邊形,顯然地$P'$ 的周長更小。矛盾得證。
c. 證明任何一個凸多邊形 C 包含點集 S 的同時也一定會包含最小周長的多邊形 P。
假設有 vertex$v \in P, but v \notin C$,同時 v 不會在 S 範圍中,因為 C 已經包含了 S$v1, v2$ 為$C, P$ 交點,則$P'$ 是$v1, v2$ 相連產生的多邊形,則 P’ 藉由 (b) 一定是多邊形,v1 到 v2 的距離更短,找到一個周長更小的多邊形。矛盾得證。
Let E be an unsorted set of n segments that are the edges of a convex polygon. Describe an O(nlogn) algorithm that computes from E a list containing all vertices of the polygon, sorted in clockwise order.
Algorithm:
map< point, vector<seg> > R
- O(n log n)
|
|
O(n)
The O(nlogn) algorithm to compute the convex hull of a set of n points in the plane that was described in this chapter is based on the paradigm of incremental construction: add the points one by one, and update the convex hull after each addition. In this exercise we shall develop an algorithm based on another paradigm, namely divide-and-conquer.
a. Let P1 and P2 be two disjoint convex polygons with n vertices in total. Give an O(n) time algorithm that computes the convex hull of P1 ∪P2.
b. Use the algorithm from part a to develop an O(nlogn) time divide-andconquer algorithm to compute the convex hull of a set of n points in the plane.
D&C 的 O(n log n)
凸包算法
a. 將兩個沒有相交的凸包,用 O(n)
時間內合併凸包$P1 \cup P2$。
假設兩個凸包儲存方式都是逆時針順序,並第一個節點為最左下的節點。
Algorithm:
O(n)
|
|
O(n)
O(n)
b.
Algorithm:
O(n log n)
|
|
Prove$T(n) = 2 T(n/2) + O(n)$,
by master theorem:$a = 2, b = 2, c = 1, log_{a}b = c, \Rightarrow T(n) = \theta (n^{c} log n) = \theta (n log n)$
Let S be a set of n disjoint line segments whose upper endpoints lie on the line y=1 and whose lower endpoints lie on the line y=0. These segments partition the horizontal strip [−∞ : ∞]×[0 : 1] into n+1 regions. Give an O(nlogn) time algorithm to build a binary search tree on the segments in S such that the region containing a query point can be determined in O(logn) time. Also describe the query algorithm in detail.
Algorithm: (build)
O(n log n)
|
|
Algorithm: (query)
|
|
(lbound, rbound)
Which of the following equalities are always true?
$$(1) Twin(Twin(\vec{e})) = \vec{e} \\
(2) Next(Prev(\vec{e})) = \vec{e} \\
(3) Twin(Prev(Twin(\vec{e}))) = Next(\vec{e}) \\
(4) IncidentFace(\vec{e}) = IncidentFace(Next(\vec{e})) \\$$
(1)(2)(4) are always true. (3) may not be true.
Give an example of a doubly-connected edge list where for an edge e the faces$IncidentFace(\vec{e})$ and$IncidentFace(Twin(\vec{e}))$ are the same.
已知$IncidentFace(\vec{e}) = IncidentFace(Next(\vec{e}))$ always true,讓$Next(\vec{e}) = Twin(\vec{e})$ always true。
Half-edge | Orign | Twin | IncidentFace | Next | Prev |
---|---|---|---|---|---|
$\vec{e_{1, 2}}$ | $v_{1}$ | $\vec{e_{2, 1}}$ | f1 | $\vec{e_{2, 1}}$ | $\vec{e_{2, 1}}$ |
$\vec{e_{2, 1}}$ | $v_{2}$ | $\vec{e_{1, 2}}$ | f1 | $\vec{e_{1, 2}}$ | $\vec{e_{1, 2}}$ |
Let S be a set of n disjoint line segments in the plane, and let p be a point not on any of the line segments of S. We wish to determine all line segments of S that p can see, that is, all line segments of S that contain some point q so that the open segment pq doesn’t intersect any p not visible line segment of S. Give an O(nlogn) time algorithm for this problem that uses a rotating half-line with its endpoint at p.
Algorithm:
|
|
|
|
出題目,出題目,萌萌哒