1. 程式人生 > 其它 >Codeforces Global Round 15

Codeforces Global Round 15

A. Subsequence Permutation

排序。

B. Running for Gold

簡單比較。

C. Maximize the Intersections

貪心讓左半邊依次和右半邊匹配。

D. Array Differentiation

把每個 $a_i=b_j-b_k$ 看作邊 $(j, k)$,既然有 $n$ 條邊,那麼肯定至少有一個環,$O(2^n)$ 列舉環上元素了之後列舉哪些是正數哪些是負數,看是否能取到 $0$。如果能取到則有解,否則無解。複雜度 $O(3^nn)$。

E. Colors and Intervals

$\left\lceil \frac{n}{k - 1} \right\rceil$ 引導我們往抽屜原理想。考慮每 $k-1$ 個顏色放在一組做,如果能保證這一組不存在重複元素就可以了。具體方法是:每次取出第二次出現位置最早的顏色,作為這個顏色的區間,然後其他顏色同時剝去第一次出現位置,正確性顯然。

F. Telepanting

如果人經過了 $x_i$ 而不被傳送,那麼意味著 $x_{1..i}$ 都已經是開著了的。考慮 $f(i)$ 表示當人經過 $x_i$ 並被傳送的時候,要經過多長時間才能再次到達 $x_i$(並不被傳送)。設 $j$ 的最小的滿足 $x_j>y_i$ 的下標,那麼 $f(i)=x_i-y_i+f(j)+...+f(i-1)$,字首和優化轉移即可。最終計算答案的時候,只需要把所有初始開著的傳送門的 $f(i)$ 加起來,再加上 $x_n+1$ 即可。

G. A Serious Referee

根據排序網路的結論,一個演算法能排好序當且僅當任意的 01 串都能排好序。那麼我們考慮搜尋所有的 01 串。如果在前 $i$ 個操作進行完了之後,只接觸到了 $S_i$ 集合內的位置,那麼我們在搜到 $i$ 的時候,也只需要考慮 $S_i$ 集合內的 01 情況。更進一步,假設 $T_i=S_i\setminus S_{i-1}$,我們只需要考慮 $T_i$ 集合內有幾個 0 幾個 1 就好了,因為在第 $i$ 個操作進行的時候,$T_i$ 集合必然會被排序,所以這裡面 01 的具體順序就不需要考慮了。

分析一下複雜度:$\prod_{i=1}^{k}(|T_i|+1)\leq \left(\frac{n + k}{k}\right)^k$。在維護 01 串的時候使用位運算,就可以保證複雜度比較低。

注意特判 $n=1$ 的情況,和 $S_k\neq [1,n]$ 的情況。

H. Guess the Perimeter

好牛逼啊。複製題解人來了。

設矩形的寬為 $w$,長為 $h$。

首先問一下所有的點組成的集合,答案就是 $(w+1)(h+1)$。

考慮問這樣的集合:$\{(di, j)|1\leq i\leq \lfloor 200/d \rfloor, 1\leq j\leq 200\}$,設其結果為 $f(d)$。

然後注意到 $d\times f(d)=f(1)$ 當且僅當 $d|(w+1)$。

接下來考慮使用 2 的次冪。設 $k$ 為 $w+1$ 的質因子 2 的個數,$p=2^k$。那麼 $\left|2f(2p)-\frac{f(1)}{p}\right|=h+1$。

於是我們只要二分出滿足條件的 $k$ 即可,集合大小隻有 $\{1,2,2^2,...,2^7\}$,所以只需要 $3$ 次就能二分出來了。帶上一開始的那次就是 $4$ 次。

I. Organizing a Music Festival

雖然這是最後一題,但確實很套路、很模板。

看到這種指定一個集合要連續的問題,不難想到 PQ tree。

PQ tree 的節點包含 P 點和 Q 點,P 點要求兒子可以以任意順序排列,Q 點要求兒子必須以正序或倒序排列。

然後插入一個集合的時候,就是一車分類討論了,我好像也描述不清,不如看看別人的部落格怎麼講(逃)。

最後求答案是很簡單的,只要在樹上根據這個點是 P 還是 Q 乘以一個貢獻即可。