做题记录 25.4.30

\(\textcolor{blue}\odot\) CF1886E I Wanna be the Team Leader

\(a\) 从大到小排序后,显然每个 \(b\) 对应一个区间最优

\(dp_S\) 表示最小的 \(i\) 使得可以把 \(a\) 的区间 \([1,i]\) 划分到 \(b\) 的子集 \(S\) 中,则答案为 \(dp_{\{1,2,\cdots,m\}}\)

\(g_{i,l}\) 表示要包含 \(b_i\),区间左端点为 \(l\),最小的右端点,容易双指针预处理

\(dp\) 的值容易由 \(g\) 得到

时间复杂度 \(O(n\log n+nm+m2^m)\)

代码

参考

\(\textcolor{purple}\odot\) CF1884E Hard Design

先断环为链,转化为求出 \([0,n),[1,n+1),\cdots\) 的答案,令 \(v=\max_{i=0}^{n-1} a_i\)

第一问为经典题目,\([l,r]\) 的答案为 \(\sum_{i=l+1}^r \max(0,a_i-a_{i-1})+v-a_r\),容易 \(O(n)\) 求出所有答案

对于第二问,将 \([l,r]\)\(v\) 的位置处拆开,则转化为两个求前缀的总价值的问题,容易栈解决,时间复杂度 \(O(n)\)

总时间复杂度 \(O(\sum n)\)

代码

参考

\(\textcolor{blue}\odot\) CF1882E1 Two Permutations (Easy Version)

先分开考虑两个序列,之后再尝试令两者操作次数相同

对于一个序列,设其为 \(AaBbC\),其中 \(A,B,C\) 为子段,\(a,b\) 为两个位置,依次操作 \(a,b,a\) 则可交换 \(a,b\)

使一个序列有序的最少交换次数不超过 \(n-1\),因此可以 \(3\max(m,n)-3\) 次操作令两个序列都有序

若两个操作序列的长度奇偶性相同,则在第一个序列后补 \(1,n\) 或在第二个后补 \(1,m\) 即可

若奇偶性不同,则可证 \(n,m\) 之中至少有一个为奇数时才有解,若 \(n\) 为奇数则在第一个序列后补 \(n\)\(n\),否则在第二个序列后补 \(m\)\(m\)

总操作次数不超过 \(3\max(n,m)-3+\max(n,m)=4\max(n,m)-3\) 可过

代码

参考

\(\textcolor{blue}\odot\) CF1878G wxhtzdy ORO Tree

把链上的 \(z\)\(\text{popcount(f(x,z))}\) 划分为 \(O(\log V)\) 个连续段,为了实现方便,树剖时的重链之间的分界点处也断开,总计 \(O(\log V+\log n)\) 段,每段取左端点跟新答案

使用 \(\text{ST}\) 表维护区间按位或和,时间复杂度 \(O(q(\log V+\log n)\log n)\)

代码

\(\textcolor{purple}\odot\) CF1879F Last Man Standing

枚举 \(x\),转化为求 \(h_i\lceil\frac{a_i}x\rceil\) 的最大值位置和次大值

\(a_i\) 从小到大排序,枚举 \(\lceil\frac{a_i}x\rceil\),则合法的 \(a_i\) 为一个区间,显然区间中只有 \(h_i\) 的最大值和次大值有用,容易用 \(\text{ST}\) 表每次 \(O(1)\) 求出

总时间复杂度 \(O(\sum (n\log n+ V\ln V))\)

代码

参考

\(\textcolor{purple}\odot\) CF1874D Jellyfish and Miku

假如确定了 \(a\),考虑计算其期望

\(f_i\) 表示 \(i\)\(n\) 的期望步数,则 \(f_n=0\)\(f_0=f_1+1\),转移为

\[f_i=1+\frac{a_if_{i-1}+a_{i+1}f_{i+1}}{a_i+a_{i+1}} \]

可化为

\[a_{i+1}(f_i-f_{i+1})-a_i(f_{i-1}-f_i)=a_i+a_{i+1} \]

\(g_i=f_{i-1}-f_i\),则有

\[g_1=1\\ a_{i+1}g_{i+1}-a_ig_i=a_i+a_{i+1} \]

可得

\[\begin{aligned} a_ig_i=&a_{i-1}g_{i-1}+a_{i-1}+a_i\\ =&a_1g_1+\sum_{j=2}^i (a_{j-1}+a_j)\\ =&a_1+\sum_{j=1}^{i-1} a_j+\sum_{j=2}^i a_j\\ =&2\sum_{j=1}^{i-1} a_j+a_i\\ \end{aligned} \]

因此

\[g_i=\frac{2\sum_{j=1}^{i-1} a_j}{a_i}+1 \]

\[\begin{aligned} f_0=&\sum_{i=1}^n g_i\\ =&\sum_{i=1}^n \left(\frac{2\sum_{j=1}^{i-1} a_j}{a_i}+1\right)\\ =&n+2\sum_{i=1}^n \frac{\sum_{j=1}^{i-1} a_j}{a_i} \end{aligned} \]

由于答案为 \(f_0\) 要最小,因此需要最小化 \(\sum_{i=1}^n \frac{\sum_{j=1}^{i-1} a_j}{a_i}\)

\(dp_{i,s}\) 表示 \(a_{1\sim i}\) 的和为 \(s\) 时该式子的最小值,则 \(dp_{0,0}=0\),答案为 \(n+2dp_{n,m}\)(当总和不足 \(m\) 时把剩余的补到 \(a_n\) 上一定不劣,因此总和取到 \(m\) 一定不劣),转移为

\[dp_{i+1,j+k}\gets dp_{i,j}+\frac jk \]

直接做为 \(O(nm^2)\)

发现 \(a\) 单调不降一定不劣,因此对于一个 \(dp_{i,j}\) 只需要转移满足 \(k\ge 1\)\(j+k(n-i)\le m\)\(k\) 即可,这样时间复杂度为 \(O(\sum_{i=1}^n \sum_{j=1}^m \frac{m}i)=O(m^2\ln n)\)

代码

参考

posted @ 2025-05-01 07:13  Hstry  阅读(2)  评论(0)    收藏  举报