原创 LightOJ 1289 LCM from 1 to n

題目分析 這道題首先給人的感覺就是素數篩,但是空間明顯不夠,但是看看時間好像可以在4ms算完,於是就要優化空間了,然後學習了一個神奇的數據結構位圖。話說位圖看了半天其實就是在每個數組中用保存的2進制數來表示該數是否存在。因此我們

原创 UVA 10047 The Monocycle(bfs)

題目分析 這道題定義狀態的時候需要多考慮,我用了四重數組,後面2維表示的分別是方向和顏色,同時旋轉的時候對4取模時候如果是減一那麼就加三mod 4,於是很簡單了,就是輸出極其噁心,不想吐槽了。。。 #include <queu

原创 Codeforces Round #403 (Div. 1, based on Technocup 2017 Finals) A. Andryusha and Colored Balloons

題目分析 這道題需要求的要多少種顏色,很明顯就是一個節點連接的邊數最大值加一。這樣再dfs進行染色,注意要保證該點與父節點和父父節點不一樣,然後就可以了,不明白的直接看代碼。 #include <cstdio> #includ

原创 UVALive 4255 Guess(前綴和+拓撲排序)

題目分析 這道題又考研了一些構圖的能力,表示自己在這方面就是一個智障。將s[i][j]轉化爲sum[j] - sum[i-1],這裏sum數組表示前綴和,然後找到前綴和的大小關係然後構圖。然後拓撲排序求得結果。 #includ

原创 藍橋杯 歷屆試題 數字遊戲

題目分析 這道題給了一個很明顯的一個序列,那麼就是數列可以一次寫爲:(1+0),(1+0+1),(1+0+1+2),(1+0+1+2+3)......(1+0+1+2+..+n−1) ,這樣就轉化爲1加上一個等差數列,那麼直接按

原创 Codeforces Round #603 (Div. 2), problem: (E) Editor

題目大意 給你一連串的操作,L, R分別代表移動光標操作,其他字符表示在當前光標位置插入一個字符。如果該位置有字符,那麼進行替換。讓你判斷當前輸出的序列是否合法,如果合法,那麼括號的最大嵌套深度是多少? 思路 首先這個序列的長

原创 藍橋杯 歷屆試題 最大子陣

題目分析 好久之前就做過,直接將2維轉化爲類似一維的解法即可。 #include <cstdio> #include <cstring> #include <iostream> using namespace std; con

原创 UVALive - 5135 Mining Your Own Business(雙聯通分量)

題目分析 這道題讓你求至少需要裝多少個escape shafts,並且在滿足最少的escape shafts情況下有多少種選擇方案。 這樣我們就可以對本圖求雙聯通分量,如果如果這個連通分量有2個以及以上割點那麼這個連通分量

原创 WOJ 24. Divide by Six

題目 請以此題面爲準 無解時輸出-1s而不是WTF 數據可能有前導零 Input file: standard input Output file: standard output Time limit: 1 seco

原创 UVALive - 3523 Knights of the Round Table(雙聯通分量)

題目分析 這道題是白書上的一道原題,但是思路很巧妙,如果沒看分析我做不出來。這裏我說一下自己的理解。因爲互相討厭的其實不能坐在圓桌上的相鄰位置,那麼很明顯我們可以在不互相憎恨的騎士中間建立邊,這樣就轉化爲了求不在任何一個奇圈上的

原创 藍橋杯 歷年試題 國王的煩惱

題目分析 這道題我是通過求最大生成樹的方法求出的,然後求這個最大生成樹的邊中有多少個權值不一樣的邊即可。 #include <cstdio> #include <cstring> #include <iostream> #in

原创 藍橋杯 歷屆試題 螞蟻感冒

題目分析 這道題分析了一下得出的結論就是最後感冒的螞蟻數量等於絕對值比第一個感冒的螞蟻的位置大的且方向向左,還有就是比第一個感冒的螞蟻的位置小的且方向向右。(這裏我們很明顯可以發現2個螞蟻碰面之後並沒有什麼影響,2個速度相同的螞

原创 UVA 10054 The Necklace(歐拉路)

題目分析 這道題題目意思是讓你用珠子組成一條項鍊,其實已經比較直接的給你邊了,並且項鍊的頭尾是一樣的,所以就相當於讓你找圖中是否存在歐拉回路。關於歐拉回路其實就是判斷所有點的入度和出度是否是偶數,如果是則存在,如果不是則不存在。

原创 點分治入門

重心分解(Centroid Decomposition) 首先要找到樹的中心,樹的重心的定義是:刪除該中心結點得到的最大子樹的頂點數最少的頂點就是樹的重心。運用dfs的方法很容易實現,代碼爲: void get_hvy(int u

原创 劃分樹板子

劃分樹 劃分樹通過模擬快速排序的過程,每次將數據分爲2部分,小的部分和大的部分,並且相同的數在序列中的位置在劃分之後相對位置依然不變,通過維護num數組計算當前位置和之前的數有多少個數被分入左子樹。具體教程詳見博客:劃分樹 劃分樹