Problem
類似 UVa 10304 - Optimal Binary Search Tree,給每個節點的拜訪頻率,建造一個二元樹,使得詢問次數最小化。
Sample Input
|
|
Sample Output
|
|
Solution
套用四邊形不等式進行優化。
|
|
類似 UVa 10304 - Optimal Binary Search Tree,給每個節點的拜訪頻率,建造一個二元樹,使得詢問次數最小化。
|
|
|
|
套用四邊形不等式進行優化。
|
|
類似 UVa 10720 - Graph Construction,給一個無向圖的每一個節點 degree,請問是否能構成圖。
|
|
|
|
使用公式加二分。
|
|
給一個序列 A,請問在 A[l:r] 中 A[i] 不被 A[j] 整除的個數為何。
|
|
|
|
首先先貪心 A[i],找到左側最鄰近的因數、右側最鄰近的因數的位置找出 L[i], R[i]。
以下使用 binary indexed tree 進行區域操作。
然後對於詢問 [l, r] 事先讀進來,加入掃描線算法,確保能夠詢問 [l, r] 時,找尋 BIT[r] 的值為何。
掃描時,當我們遇到某個因數所展開的區間 [L[i], R[i]] 的左端點
因此資料結構要維護
|
|
找到 Ax + By + Cz = P, 給定 A, B, C, P,要求 (x, y, z) 有幾組解,並且 x >= 0, y >= 0, z >= 0。
|
|
|
|
看一下數據範圍 0 < A, B, C, P <= 100000000,C / gcd(A, B, C) >= 200,後者是強而有力的條件,肯定 z 情況最多 100000000/200 = 500000 個可能,窮舉 z 的情況,用擴充歐基里德找到 Ax + By = (P - Cz) 的解個數。
|
|
在一個迷宮中有 M x N 個房間,每個房間有四個門,並且以逆時針的順序依次出現,每一個時間每個房間只會有一個門通往另一個地方。
必須從左上角開始,花最少時間收集到 K 個寶物後抵達右下角。
|
|
|
|
分析狀態,由於 K 不大,直接 2^K 狀態下去,而只會有四個門,因此時間論替只需要考慮 mod 4 的結果,最後 dist[x][y][4][1<<8]
抵達 (x, y) 時的門狀態、同時身上帶了多少寶物 (用 bitmask 去壓縮)。
BFS 一下就過去,記得要注意可以在同一個房間內等待下一個時刻。
|
|
每到吃飼料時間,某 M 正思考要去哪裡解決,雖然有很多很多地方可以去吃,由於某 M 對於美食沒有特別需求,所以只會到最近的幾個地點即可,然後再以循環輪食的方式日復一日。
某 M 現在的位置與每個餐館的位置都用一個笛卡爾坐標系中的點表示,每個點與每個點的距離為歐幾里得距離。
x = (x1,…,xn) 和 y = (y1,…,yn) 之間的距離為
現給出在 K 維空間中某 M 所處的位置座標,以及 N 個餐館位置,請觀察某 M 會到哪裡吃飼料。.
輸入有多組測資,
每一組第一行會有兩個整數 N, K,
接下來會有 N 行,每行包含 K 個整數,表示第 i 個餐館座標。
接下來一行,包含一個整數 Q,表示某 M 的可能座標 。
接下來會有 Q 行,每一組詢問會有兩行,第一行會有 K 個整數,表示某 M 所在的座標,第二行會有一個整數 P。
(N < 8192, K < 6, Q < 10,000, P < 11, 座標值 0 < x, y < 10,000)
對於每一組詢問,輸出一行 Case #:
,第一個整數為 P,接下來 P 個整數按照距離由小到大輸出餐館編號,如果相同則輸出編號小的。
|
|
|
|
|
|
現在有 n 個堆,位於位置 xi 的堆重量 wi,對於每一堆可以移動到位置大的地方,移動的成本為(xj - xi) * wi
,請問集中 k 堆的最少花費為何。
|
|
|
|
dp[i][j]
: 表示放入 i 堆,集中 j 堆的最少花費
|
|
將公式調整為上述結果,會發現我們依序帶入的 X[i] 遞增,也就是斜率會越來越高,要使後半部常數越大越好,保證此線會相交於凸包的頂點上。
凸包點 (sumW[k], dp[k][j-1] + sumXW[k])
|
|
給 n 個點趨勢圖,可以選擇忽略某些點,忽略的點會被剩餘點補上靠左。
請問要恰好 k 個 peak 的情況,有多少不同的趨勢圖貌。這別要求兩個相鄰的點不可以有相同 y 值。
|
|
|
|
TLE 版本,答案是正確的。 O(n^2 m)
其實這有點接近貪心作法,狀態為 dp[i][k][3]
表示加入第 i 個點,產生 k 個 peak,並且下一次要接 y 值較高、較低、等於的點。
而考慮當前 k 個 peak y[i],對於三種高地要求,我們只會轉移到不同的 y 值,也就是對於後面如果存有 y[p] = y[q], p < q,盡可能選擇 p 小的,否則會重複計算,要忽略 q 大的。
從下面樸素算法中,可以獲得基礎的遞迴公式。
|
|
使用 binary indexed tree 優化 O(nm log n)
使用前綴總和來完成狀態轉移。為了防止相同 y[p] = y[q], p < q
,由於會先拜訪到 p 進行狀態轉移,特別考慮 y[q] 基底的轉移狀態必須被扣除 y[p] 的結果。
|
|
對於每一個浮點數,找到一個最靠近的分數,分子分母限制在 [1, 1000]
的整數。
|
|
|
|
預先將所有分數建表,然後每一次二分搜索。
最麻煩在於輸出要保證長度 10 位,細讀 printf() 後,發現頂多限制小數點後的位數、小數點前的位數,如果要同時限制還是要自己來。
最後使用 %*.*f
,*
號部分要自己帶入參數。如果用 substring 會造成四捨五入的地方消失而拿到 WA。
原本想不建表,直接用鄰近搜索,誤差害死人。
|
|
給一個浮點數一位的線段,請問中間經過多少個整數點。
|
|
|
|
找到原本線段 ax + by = c 的線,為了使其落在整數座標上調整為 10a x + 10b y = c,在這個情況下找到符合的 (x, y) 整數解,但是其結果要被限制上線段上。
努力地做細部微調 …
|
|