coci2018 題解


plahte

給定一些矩形和一些有顏色的點,求每個矩形上有多少種顏色的點,保證矩形只有包含和不相交兩種關系,規模 \(10^5\)

把每個矩形看成一個點,用掃描線建出森林,同時也順便處理點。

然后做一個樹上的集合轉移,把兒子集合的元素並到父親集合去。這個問題有樹狀數組的做法,但我試了一下輕重鏈剖分,寫起來還是挺友好的。注意這里的重兒子選擇標准不是節點個數,而是節點上顏色個數,這樣復雜度算起來才是正確的。(一個log跑起來比兩個log的標算慢我也是很服氣


san

給出一個長度小於等於 \(20\) 的二元組序列和一個數 \(k\)\(k\) 的規模為 \(10^{10}\),第一個數代表高度,第二個數代表金幣,求金幣總和不小於 \(k\) 的不下降子序列個數。

折半搜索。將原序列分成 \([1,n/2],[n/2+1,n]\) 兩個區間,以高度為關鍵字升序加入每一個點,顯然后加入的且在后半部分的點都可以由前面加入的且在前半部分的點轉移,數據結構維護值域上的區間和即可。

這題很好地證明了背包問題是NP難的?

usmjeri

給出一棵樹以及若干個限制條件,要求你把樹定向成一個有向圖,使得給出的限制中的每對點聯通,求方案總數,規模 \(10^{5}\)

首先把問題轉化為給邊染色:對於每個限制 \(a_i,b_i\) ,給樹上的邊染色,令 \(c_i=lca(a_i,b_i)\),使得 \(a_i \rightarrow c_i\) 上的邊顏色相同,\(b_i \rightarrow c_i\) 上的邊顏色相同,如果 \(a_i,b_i\) 不屬於一條鏈,還需滿足 \(a_i \rightarrow c_i\)\(b_i \rightarrow c_i\) 上的顏色互異。

先嘗試解決一個 auxiliary problem:多次把樹上路徑之間的所有點合並,求聯通塊個數?做法類似於差分:維護 \(low\) 數組,初始 \(low_x=dep_x\) 合並 \(a,b\) 時做一個操作將兩個點的 \(low\) 與其 lca 取最小值。

這樣從根再做一遍 dfs,把 \(low\) 值小於當前節點深度的兒子與當前節點連邊。對新圖再 dfs 一遍就可以求出解。

然后對於每個限制,把兩點到 lca 的鏈合並,如果不在一條鏈上,再把這兩個點也連上特殊邊。注意一個合法的聯通塊中,不能存在有奇數條特殊邊的環,否則答案就是 \(0\),所以要跑一邊二分圖染色判斷是否合法,若合法,每個聯通塊的貢獻只能是 \(2\),乘到答案里就可以了。

garaza

給出一串數列,多次詢問區間內所有數均不互質的子序列個數,支持單點修改,規模 \(10^{5}\)

瞄的題解。這種題目肯定是要把信息轉換為線段樹上容易合並的形式。題解的方法就是做一遍前綴 gcd,再做一遍后綴 gcd。設前綴 gcd 去重相鄰前后兩項為 \(a,b\),顯然 \(b \mid a\)\(b \neq a\),則 \(b \leq \frac{a}{2}\),因此前綴 gcd 去重后的項數是對數級的,后綴同理,於是兩個區間合並可以直接暴力統計跨過分界線的貢獻,同時維護前綴和后綴即可。


dojave

給出一個 \(0...2^{M}-1\) 的排列,對於每個非空區間,你必須選擇排列中的任意兩個不相同元素並且交換,如果存在一種交換可以使這個區間內的數異或和恰好為 \(2^{M}-1\),則這個區間是合法的,求合法區間個數,\(M\)的規模為 \(20\)

一道裝滿智慧的題。約定\(S=2^M-1\) ;兩個數關於 \(k\) 配對,當且僅當它們的異或和為 \(k\) 。如果一個區間的異或和為 \(g\) ,則其合法的充要條件是存在 \(A,B\)\(A\) 在區間內, \(B\) 在區間外,且 \(A,B\)\(S \oplus g\) 配對的。

顯然直接統計較為困難,正難則反,統計不合法情況。不合法即區間內部有 \(len/2\) 個 $S \oplus g $ 配對。這樣就可以排除奇數區間的情況,因為其中肯定有一個漏下的和外面可以匹配。考慮 \(len/2\) 是奇數的情況,此時可以推出 $ S \oplus g \oplus S \oplus g= S$ ,顯然不成立。所以 \(len /2\) 是偶數,順便可以得出 \(g = 0\),所以最后的結論就是不合法的區間長度為 \(4\) 的倍數,且其中所有數都是兩兩 \(S\) 匹配的,用 hash 即可完成這個統計。

sazetak

有一個長度為 \(n\) 的未知的數列。對於一個輸入 \(k\) ,你可以得到一個 \(\lceil \frac {n}{k} \rceil\) 元組 $$(a_1+...+a_k,a_{k+1}+...+a_{2 \times k},...,a_{{\lceil \frac {n} {k} \rceil} \times k}+...a_n)$$

現在給出數列 \(k_i\) 說明你得到了對於這些輸入的信息,問你可以用這些信息至多確定多少數列中的元素,\(n\) 的規模為 \(10^9\)\(k\) 的規模為 \(10\)

考慮只有兩條信息 \(k_1,k_2\) 時,所有的確定元素均滿足下面的方程組,其中 \(k_1,k_2\)可互換。

\[\begin {cases} x \equiv 0 \pmod{k_1} \\ x \equiv 1 \pmod{k_2} \\ \end {cases} \]

那么如果有多條信息,則可以將其分成兩組,第一組的最大公倍數等價於 \(k_1\) ,第二組的最大公倍數等價於 \(k_2\),然后再將其累加。有一個問題是貢獻會重復,那么就可以容斥總信息集,然后做一個 \(O(3^n)\) 枚舉子集的操作即可。


vode

綿羊和山羊博弈,它們圍成一個圈,每人報出 \([1,k]\) 之間的數字,並且加到 \(sum\) 中,同時要確保操作后 \(sum \leq M\),如果不能完成操作就輸了。求以每個位置為起點時,誰是必勝的,規模均為 \(5 \times 10^3\)

考慮狀態 \(f_i,j\) 表示第 \(i\) 個動物這次報 \(j\) 這個數是不是必勝的。則其可以從 \(f_{i+1}\) 倒推過來,即 \(f_{i+1,j+1...j+k}\) 中至少有一個不是必勝的而且第 \(i\) 個動物與第 \(i+1\) 個動物不是一樣的,或者 \(f_{i+1,j+1...j+k}\) 中至少有一個是必勝的且動物類型相同,前綴和優化即可。

krov

給出一個序列表示一張柱狀圖,序列中的每個數表示這個位置柱子的高度,將根柱子長度增加或減少 \(1\) 的代價都是 \(1\),長度規模 \({10}^{5}\),高度規模 \({10}^{9}\)。求出將其變成一個屋頂的最小代價。屋頂是指一個呈金字塔形的柱狀圖,滿足其柱子長度均為正整數且 $$\exists a_i,\forall a_j=a_i-\left | j-i \right |$$

枚舉屋頂的頂點,則答案關於該頂點高度的函數顯然是一個凸函數,三分這個高度,現在則需要可接受的復雜度內求出該高度下的答案函數值。這個求值可以用平衡樹實現,從 \(i\) 更新到 \(i+1\),只需要將 \(i+1\) 從右樹刪除,加入左樹,同時左邊打上 \(+1\) 標記,右邊打上 \(-1\) 標記以模擬相位,查詢區間就可以了。

非旋Treap的常數emmm...復雜度是 \(O(n\log n)\),但最后一個點在cf上跑了 1.4 秒,本機上只能跑 \(n=50000\) 左右的數據,棄了等題解xD。

瞄了一眼Result,第四名的羅馬尼亞小哥和我的實現方法相似,拿了 126 分。滿分是詭異的 BIT 算法,理解不能。

ceste

給出一張無向圖,每條邊有兩個權值,求出 \(1\) 號點到其他所有點的乘積最短路,點數規模為 \(5000\)


pictionary

\(N\) 個點,在 \(M\) 天里面,連接 \(a\)\(b\) 的無向邊在第 \(m-gcd(a,b)+1\) 建成,給你若干詢問,輸出詢問中兩個點聯通的最早時刻。點數規模 \(10^5\)

考慮建圖跑 MST,然而復雜度太高。那么把每天也都看成點來優化建圖,根據調和級數,邊數就是 \(O(n \log n)\) 的,詢問時輸出樹上路徑的最小值即可。

planinarenje

給出一張二分圖,從二分圖左側出發,兩人交替行走,不能走到走過的節點,不能走的人輸。若兩人均采取最優策略,詢問對於每個起點誰是必勝態。點數和邊數規模 \(5 \times 10^3\)

裸的二分圖博弈,移除起點跑一次最大匹配,檢查匹配數是否相等即可。


cover

給出坐標系里的一些點,你可以用若干個矩形覆蓋它們(包括邊界),求矩形的最小面積和。矩形的邊必須和坐標軸平行,且矩形的中心必須恰好位於原點。點數規模 \(5 \times 10^3\)

顯然點具有對稱性,所以可以把所有的點變換到第一象限,按 x 坐標排序,設 \(f_i\) 是覆蓋完前i個點的最小代價,則$$f_i=min \left{ f_j+max \left{ y_{j+1} * y_i \right} \times x_i \right}$$

kotrljanje

給出一個數列 \(a_n=Cn+D\),要求你構造另一個長度為 \(M\) 的數列 \(b_n\),使得 \(a_{b_i}\)\(B\) 進制下各數位和相等。\(C,D\) 規模 \(10^4\)\(B\) 規模\(5 \times 10^3\)\(M\) 的規模 \(2.5 \times 10^5\)

考慮暴力枚舉這個 \(n\) ,可以根據抽屜原理算出時間復雜度為 \(O(Mblog_b max)\),而且其中的 \(max\) 不會太大。其實如果精細實現的話,這個暴力可以跑出滿分。

現在我們把枚舉的步長調到 \(b-1\),根據這個定理,一個數在 \(b\) 進制下的數碼和與這個數對 \(b-1\) 同余,那么桶的個數降到了原來的 \(\frac{1}{b-1}\),時間復雜度就降低到了 \(O(M\frac{b}{b-1}log_b max)\),可以跑過去了。

vrtic

\(N\) 個數分配給 \(N\) 個人,給出 \(a_i\),設每個人分到的數是 \(b_i\),最小化 \(b_i-b_{a_i}\) 的最大值,要求輸出方案,點數規模 \(150\)


dostavljac

給出一棵樹,點具有權值。從 \(1\) 號點開始,有兩種操作,一個是向相鄰節點走一步,還有是獲得點上的權值(不能獲取兩遍)。總操作次數不超過 \(M\),最大化獲得的權值。節點數和最大操作數規模 \(500\)

定義 \(f_v,x\) 為使用 \(x\) 單位操作后,能從 \(v\) 的子節點走回 \(v\) 的情況下獲得的最大權值, \(g_v,x\) 為使用 \(x\) 單位操作后,能從 \(v\) 的走到其子樹任意一個子節點的情況下獲得的最大權值。然后就可以做一個類似背包的轉移求出最優解了。

priglavci

給出 \(N\) 個人,\(M\) 個點,\(K\) 條巴士線,每條巴士線上都包含有若干個點,人可以從這些點上車,但每條巴士線不能容納超過 \(C\) 人。把每個人分配到一個點上車,定義分配代價為他到點的歐氏距離,求所有人的代價的最大值的最小值。

考慮二分,建出三列點分別表示人、點和巴士線,選出合法邊后按題意建圖跑最大流,判斷是否有 \(N\) 的流量即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM