忘報名北大集訓,還是能看到題,省了 8000 塊錢,贏麻了。
鴿表示沒代碼,may be 無正解思路。
Day 1
A. 末日魔法少女計划
\(k = 2\) 的做法:考慮分治,取中間點,處理所有跨過中點的,連上左右兩邊所有到這里的邊,遞歸下去。
\(k = 3\) 的做法,取若干關鍵點分成若干塊,開頭結尾兩塊只用連后綴 / 前綴邊,中間每塊連前后綴,並且中間關鍵點兩兩連邊,用 dp 算出最優的分塊位置。
\(k > 3\),考慮擴展,定義 \(f_{k, n}\) 為長度為 \(n\),需要兩兩距離 \(\le k\) 的最優方案。考慮選 \(m - 1\) 個關鍵點分成 \(m\) 塊,每塊大小 \(a_i\),塊內部遞歸為 \(f_{k,a_i}\),然后 \(m-1\)個關鍵點可以遞歸成 \(f_{m-1,k-2}\)。
dp 出最優方案。
dp 太慢,要優化,這次的決策點可以繼承 \(f_{k,n-1}\) 的,分的塊數(好像差異很大,為啥呢?),前后綴數量都是 O(1) 的,並且前后綴長度差異不超過 1,中間差異不超過 1。
這樣再卡卡,就行了。。
B. 魔塔 OL
令怪物總數、詢問數量是 \(O(n)\) 量級,\(g, l, d\) 值域是 \(V\)。
順序如果確定,打怪物看成 \(-a, b\),答案就是 $- $ 前綴 \(\min\)。
首先過程可以貪心描述,先打能回血的,回血里按 \(a\) 從小到大打,之后每次血量都會變小,一定按 \(b\) 從大到小打(考慮微繞 \(\min(-a_1, -a_{1}+b_1-a_2) \ge \min(-a_2,-a_2+b_2-a_1)\),兩個括號左邊不可能作為全局最小值,即 \(b_1 \ge b_2\),答案不會更劣)
於是問題變成了四維偏序空間內,按一定順序排好的前綴 \(\min\)。(可以理解為有 \(5\) 個維度?
每次暴力是 \(O(qn)\),有 \(10\) 分。
\(>3\) 維偏序,\(\log\) 類分治數據結構不如根號,根號不如 bitset。
但這個還得按特殊順序排序,考慮每 \(B\) 塊預處理,我們只會每塊 \(O(2^B)\) 的復雜度預處理,所以預處理總復雜度 \(O(\frac{n}{B}2^B)\)。
查詢的時候,把每一維的 bitset 整出來 and,然后在預處理的東西里查詢即可,復雜度 \(O(\frac{n^2}{B})\)
取 \(B = \log n\) 最優,復雜度為 \(O(\frac{n^2}{\log})\)。
感覺蠢爆了。但是在這個數據復雜度確實很優越。。。
為了規避巨大空間,可以按塊處理,這樣空間就是線性了。
C. 基因編輯
咋會還有這種題。
記 \(pre_i\) 是 \(i\) 同顏色前驅。
選擇的 \(x, y\) 需滿足,\(a_y\) 在 \([r + 1, n]\) 中唯一,\(a_x\) 在 \([1, y]\) 中唯一,\(x \ge pre_y\)。
按 \(y\) 從小往大,維護出現一次的 \(x\) 的集合,取最大的元素看一下就行。
\(O(n \log n)\)
Day 2
A. 簡單數據結構
全局操作,考慮記個 \(tag\) 表示進行了幾次操作 \(2\)。
那么每個值設為 \(a_i + tag \times i\)。那么每次 \(1\) 相當於全局對 \(v - tag \times i\) 這個等差數列進行 \(\text{chkMin}\)。
如果一開始 \(a\) 無窮大是好做的,每次改變的是一個后綴,維護一個棧算一下覆蓋的后綴是哪些,區間覆蓋等差數列就好了。
考慮算一下每個 \(i\),\(a_i\) 什么時候第一次被 \(\text{chkMin}\),之后的過程就是類似上面的,相當於維護一個 \(01\) 序列,支持維護 \(1\) 的那些點的和,覆蓋等差數列,以及單點 \(0\) 變 \(1\)。
找到第一次,可以整體二分 + 李超樹 \(O(n \log ^2n)\),瓶頸也是這里。
B. Datalab
此題可以做到兩次,深感恐懼,還沒讀戴老師代碼。
垃圾做法:
\(8200\) 次:從高到低確定每位,考慮每次問兩個一樣的串,只有第 \(i\) 位是 \(1\),那么他會進位到后面的一段 \(1\),期中滿足最后一個 \(1\) 位置和他同號,中間那些和他異號。
考慮並行這個過程,但是如果低位擴展太長影響高位就寄了,,
考慮分塊,把 \(8200\) 分成 \(90\) 塊,每塊從開頭開始擴展,發現每次要么都擴展了至少 \(1\),要么有一塊跨越段爆了,復雜度貌似可以保障,從小到大找到最小的跨越一段的塊,前面的往右邊跳,這個塊跨完了,分析一下上界是 \(2\sqrt{8200} = 180\) 的,卡點通過,又慢又拉。
Code
C. 隨機游走
首先肯定只有 \(x \rightarrow 1\) 這樣的邊讓他回去更快。
然后打表發現是這么放的(令 \(x\) 表示連 \(x \rightarrow 1\) 的邊):
- 最前面 \(n - 1\) 個:\(n,n-1,\dots,3,2\)(沒有 \(1\) !)
- 后面每 \(n\) 輪從大到小各放一個。
設 \(c_i\) 表示 \(i\) 到 \(1\) 連的邊數。\(c\) 顏色相同連續段最多 \(3\) 段。
同時自然列出 \(O(n)\) dp,發現可以矩陣快速冪優化 發現 \(c\) 相同一段其實就是等比數列求和。
\(O(T \log n)\)
Day 3
A. 小明的樹
詐騙。
考慮什么時刻是合法的,發現是未點亮的聯通塊是一 \(\Rightarrow\) 當前兩頭都未點亮邊數是 $n - 1 - $ 當前操作次數。
有根樹居然推出無根限制,真神秘。。。限制每條邊獨立。
同時如果合法的,目前貢獻相當於一頭點亮一頭未點亮個數。
所以合法位置個數可以轉化為區間加,求 \(0\) 的個數,同時求 \(0\) 的位置那些貢獻和,還得區間加貢獻 ,線段樹維護最小值 \(\&\) 最小值次數,同時維護最小值對應的貢獻值之和即可。
樹真恐怖。
\(O((n + m) \log n)\)。
B. 出題高手
個人理解,區間長度不會太長。
果不其然,\(2000\) 足以。
掃描線,\(O(1)\) 改,\(O(\sqrt{n})\) 區間 \(\min\)。
喜提最劣解。
\(O(m \sqrt {n})\)
C. 撲克比大小
鴿。
Day 4
A. 算術
應該是任意一種情況,對應系數成比例。
設長度是 \(n\)。
那么對應關系是 \(b^i \leftrightarrow (-1)^{\lfloor\frac{i}{k}\rfloor} b^{\lfloor\frac{n}{k}\rfloor - \lfloor\frac{i}{k}\rfloor\ +\ i\ \bmod\ k}\)
代入 \(i = 0\) 發現這個比例是 后者是前者的 \(b^{\lfloor\frac{n}{k}\rfloor}\) 倍。
這個 \(i\) 是隨便取的,那么就得有 \(b^{k+1} = -1\)。
就大概就是半階 \(-1\)。
根據一些數論知識,\(b, p\) 不互質沒有階,沒有階沒有半階。
半階的奇數倍也都是 \(-1\)。
階的所有倍都是 \(1\)。
考慮半階若存在只能是階 \(/2\),如果不是,會發現階會變的更小,矛盾。
這樣只用找階,分解素因數后,可以有每次 \(\log\) 做法。
考慮分解 \(\phi(p)\) 質因數,每次考慮一個質因子至少需要幾個,剩下的都湊足了,重復直到是 \(1\) 即可,每個質因子獨立。
有些情況要特判 \(p = 2\),半階為 \(1\) 時答案是 \(2\)。
復雜度 \(O(\sqrt{p} + T \ \times \log p)\)
B. 經典游戲
注意每次操作有后效性。。。
沒有特殊條件的基礎游戲,每個棋子 \(sg\) 函數就是子樹 \(mex\),就是子樹高度。
加上特殊條件,如果根確定,當前狀態就是 \(a\) 奇數位置的高度的 \(xor\),K 想贏,必須選一個 sg 函數恰好是當前狀態的把異或為 \(0\),而又他能選的是一段區間滿足 \(\le\) 最大高度。
定義 \(w_x\) 為距離 \(x\) 最遠的距離。
轉化完題意就是一個點是好的當且僅當以它為根 \(1\) 的位置的高度的 \(xor\) 大於 \(w_x\)。
直接求 \(O(nm)\) 可以 \(45\)。。
就是問一個臨域有多少好的。
可以發現若干根號平衡方法,但是在樹上,通常有鏈剖分的形式來轉化為 \(\log\)。
考慮一個點的影響,相當於最多對 dfn 的三個區間 xor 相同的數。
考慮長鏈剖分,相當於每次修改,子樹外部分,長兒子,輕兒子們 xor 的數各自一樣。
那么就簡單的做到了 \(O(\log)\) 改、查單點。這樣能得 69 分,11 那個過了感覺是數據太水。
考慮單獨維護每個點輕兒子的答案,剩下的暴力查。
發現幾乎全部點,他們輕兒子也都是整體 xor 一個樹,除了 \(x\) 如果是自己父親的輕兒子,那可能只用改 \(x\) 在清父親中的影響。
那么我們考慮這樣一個數據結構,初始有兩個序列 \(a_{n}, b_{n}\),每次 \(a\) 整體異或 \(k\),求有多少個 \(i\) 有 $a_i > b_i $。
這題其實限制更緊,\(b_i\) 都一樣,不過我沒發現。。。
記錄當前異或的總量 \(k\),發現對於一個 \(i\),有貢獻的 \(k\) 可以拆成 trie 樹上 \(\log\) 個子樹,那么插入的時候把這些子樹加,查詢單點查走到底加起來就行。
復雜度 \(\log\)。
總復雜度 \(O((n + m) \log n)\)。
C. 隨機數據
\(30\) 分:先看成 \(i \rightarrow (i+d) \bmod n\) 的若干環。b 每次能選肯定選沒壞處。可以轉化為相鄰兩個可用之間連邊,權值是兩個的 \(\min\) 的最大匹配。首先考慮一組方案一定能找到這樣匹配,然后這樣一組匹配 b 也有方案,就是 a 占一個,b 立刻占另一個,如果 a 占到 min 的,a 拉了,b 更厲害了。這樣可以在線段樹上維護這個東西,記一下左右兩邊和選沒選,\(O(q\log n)\),寄。
可能需要類 / 萬歐?我好菜,不會。
