Codeforces 1329 题解
A
先構造最左方案,然后能調整盡量調整即可。
時間復雜度 \(O(m)\).
代碼: 75367082
B
顯然每個二進制位是獨立的,且只能有 \(0\) 個或 \(1\) 個數在該位上有值。乘起來即可。
時間復雜度 \(O(\log n)\).
代碼: 75373134
C
貪心。每次刪去能刪的盡量大的(不虧)。
比較好的實現方法是定義一個 solve(u) 函數,先不停地刪 \(u\) 點直到刪不下去為止,然后再遞歸 solve(u<<1),solve(u<<1|1). 沒有必要比較大小,因為每個子樹內刪的個數是固定的。
時間復雜度 \(O(2^hh)\).
代碼: 78094188
D
對于每一對相鄰相等的元素,我們在中間畫一條線,并定義線的值等于相等元素的值。于是就得到了一個新的序列,操作等價于:在新的序列上選擇相鄰兩個元素,如果不等則一起刪去,相等則留下一個。也就相當于盡量多刪不等的。
不難發現最優策略:當不存在一個元素出現次數嚴格超過一半時一定可以一直刪不同直到只剩下一個元素,否則可以讓每個其他元素都和這個元素配對。策略就是如果還剩下兩種或更多則取出現次數最多的和它任意一個相鄰的刪,否則就刪相同的。
難點是如何實現:要對每個字符維護一個集合,集合中的每個元素是一個二元組,表示一對相鄰不同的位置,且其中一個是該字符。使用 set 即可。
最后還要求輸出方案,要找到在當前序列中的位置,樹狀數組+并查集維護哪些點還沒被選即可。
時間復雜度 \(O(n|\Sigma|+n\log n)\).
代碼: 78207027
E
首先稍微轉化一下:有 \(m\) 個數 \(a_i\),找出一個序列 \(b_i\) 滿足 \(\sum^m_{i=1}b_i=K\) (\(m,K\) 實際為輸入的 \(m+1,K+m+1\)),對每個 \(i\) 找出 \(b_i\) 個正整數和為 \(a_i\),最小化所有找出的數的極差。
不難發現對于一個 \(i\) 最優策略一定是分配得盡量平均,即 \(b_i-a_i\mod b_i\) 個 \(\lfloor\frac{a_i}{b_i}\rfloor\) 和 \(a_i\mod b_i\) 個 \(\lceil\frac{a_i}{b_i}\rceil\). 于是就是要最小化 \(\max^m_{i=1}\lceil\frac{a_i}{b_i}\rceil-\min^m_{i=1}\lfloor\frac{a_i}{b_i}\rfloor\).
考慮求出兩個值:\(R\) 表示 \(\max\) 部分的最小可能值是多少,\(L\) 表示 \(\min\) 部分的最大可能值是多少。這個容易直接二分得到。
可以發現如果對于每個 \(i\) 都存在 \(b_i\) 滿足 \(L\le\lfloor\frac{a_i}{b_i}\rfloor\le\lceil\frac{a_i}{b_i}\rceil\le R\) 則一定可以在 \(L\) 和 \(R\) 的方案基礎上進行調整得到總個數恰好為 \(K\) 的方案。即這種情況下答案為 \(R-L\).
但是有可能存在一些 \(i\) 不存在合法的 \(b_i\). 這時候我們求出最接近 \([L,R]\) 的 \(b_i\),即滿足 \(\lfloor\frac{a_i}{x}\rfloor\lt L\) 的最小的 \(x\) 和滿足 \(\lceil\frac{a_i}{y}\rceil\gt R\) 的最小的 \(y\). 我們令 \(a_i\) 的貢獻(就是參與到 \(\max\) 和 \(\min\) 的計算中的值)為 \(x\) 和 \(y\) 中的一者(顯然它不可能同時成為 \(\max\) 和 \(\min\),因為它不可能既 \(\gt R\) 又 \(\lt L\)),那么和上面同理可證一定能調整得到一個合法方案。
于是我們的問題就轉化為,有一個集合,初始時只有 \(L,R\) 兩個數,現在有 \(n\) 個二元組,要從每個中挑出一個加入集合,最小化集合內的極差。直接先默認全選小的,然后從小到大每次把最小的改成選大的即可。
時間復雜度 \(O(m\log m+m\log n)\).
代碼: 78272837
總結
以上是生活随笔為你收集整理的Codeforces 1329 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学习笔记】关于正整数除法下取整和上取整
- 下一篇: Codeforces 1326F Wis