做题记录 25.8.11

\(\textcolor{blue}\odot\) P1053 [NOIP 2005 提高组] 篝火晚会

先根据给出的关系求出环上点的顺序,设依次为 \(p_1,p_2,p_3,\cdots,p_n\)

假设已经于初始位置对应,则答案为 \(\sum [p_i\ne i]\)

显然将 \(p\) 旋转 \(\{(p_i-i)\bmod n\}\) 的众数个位置最优

容易做到 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) CF1599J Bob's Beautiful Array

存在重复数字时,将其中一个重复的值置为 \(0\) 后显然为一组解,因此考虑无重复的情况

若对于 \(b\) 的一个子集构造出的等大小的 \(a\) 使得满足要求,则容易得到整个方案(子集外的 \(a\) 任选一个子集内的数字匹配即可)

对于三个数字 \(a,b,c\),若 \(2\mid (a+b+c)\),则可构造 \(\frac{a+b-c}2,\frac{a+c-b}2,\frac{b+c-a}2\)

\(b\) 中存在偶数,则 \(n\ge 4\) 时必然存在满足上述要求的 \(a,b,c\),且求出具体方案是容易的

特判 \(n\le 3\) 的情况,则只需要考虑 \(b\) 全为奇数的情况

显然此时选出的子集大小必然为偶数

设选出 \(b_{1\sim 2s}\),对于任意的 \(x\) 可构造 \(x,b_1-x,b_2-(b_1-x),b_3-(b_2-(b_1-x)),\cdots,b_{2s-1}-\cdots(b_1-x)\),若有 \(b_{2s-1}-\cdots(b_1-x)+x=b_{2s}\) 则为一组合法解,此时要求 \(\sum_i b_{2i+1}=\sum_i b_{2i}\),因此需要找出两个大小和总和相同的不同子集(若相交则都删去相交的部分)

\(n\ge 27\) 时,\(\binom{n}{\frac n2}<10^6\times \frac n2\),必然有解,因此只要枚举前 \(\min(n,27)\) 个元素的子集即可

时间复杂度 \(O(n+m2^m)\),其中 \(m=\min(n,27)\),使用一些技巧可以优化到 \(O(n+2^m)\)

代码

参考

\(\textcolor{purple}\odot\) CF1599G Shortest path

当起点为额外点时,显然先到达一端,然后走到另一端,途中经过所有点

当起点在直线上时,一种可能为先到达额外点,然后转化为上一种情况

另一种可能为选择直线上相邻一对点 \((i,i+1)\)(假设按顺序排列为 \(1\sim n-1\)\(n\) 为额外点,\(k\) 为起点),\(1\le k\le i\)\(k-i-1-n-(i+1)-(n-1)\)\(k-1-i-n-(i+1)-(n-1)\)\(k\ge i+1\) 时同理

容易做到 \(O(n\log n)\)

代码

参考

\(\textcolor{purple}\odot\) CF1599F Mars

先将所有 \(a_i\) 一同偏移一个随机数,显然答案不变

对于询问 \(l,r,d\),设重排后为 \(f+id\mid _{i=0}^{r-l}\),则 \(\sum_i (f+id)=\sum_{i=l}^r a_i\),可得 \(f=\frac{\sum_{i=l}^r a_i-\frac12(r-l)(r-l+1)d}{r-l+1}\)

因此重排后的序列是确定的

保存区间内 \(a_i\)\(k\) 次方和,其中 \(k\) 为任意选择的一个较小的正整数,代码中取 \(37\)

\(\sum_{i=0}^{r-l}(f+id)^k =\sum_{j=0}^k \binom kj f^j d^{k-j}\sum_{i=0}^{r-l}i^{k-j}\),对于所有 \(s,p\) 预处理 \(\sum_{i=0}^s i^p\),并预处理组合数,容易 \(O(k)\) 求出哈希值

总时间复杂度 \(O((n+q)k)\)

代码

参考

[2025“钉耙编程”中国大学生算法设计暑期联赛(8) 1008] 最完全的替换

从前往后考虑 \(s\) 的位,尝试用 \(t\) 的第一个 \(1\) 消去 \(s\) 的第一个 \(1\),若无法完成则无解,否则显然操作次数最小

时间复杂度 \(O(\sum nm)\),精细实现可以做到 \(O(\sum \frac {nm}\omega)\)

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(8) 1009] 最努力的活着

显然前 \(\lfloor\frac nw\rfloor\) 个计入答案一次,令 \(n\gets n-\lfloor\frac nw\rfloor\),接下来\(\lfloor\frac nw\rfloor\) 个计入答案两次,以此类推,因为和最大,因此依次分配 \(1\sim n\)

\(\lfloor\frac nw\rfloor\) 相同的一段并在一起计算

答案不超过 \(O(V^3)\),因此可以用 __int128_t

\(w>\sqrt n\) 时,\(\lfloor\frac{n'}w\rfloor\mid 1\le n'\le n\) 只有 \(O(\sqrt n)\)

\(w\le\sqrt n\) 时,每次操作至少令 \(n\) 减少 \(\sqrt n\)(初始的 \(n\)),直到 \(w>\sqrt n\),在此之前操作次数不超过 \(O(\sqrt n)\),在此之后操作次数不超过 \(O(\sqrt n)\),因此总次数也是 \(O(\sqrt n)\)

综上,时间复杂度 \(O(\sum \sqrt n)\)

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(8) 1004] 最糖的题目

\(a\)\(b\) 构成的可重集不同时显然不合法

\(k=1\) 时,若 \(a=b\) 则合法,否则不合法

\(k=n\) 时,用最小表示法判定是否合法

可证当 \(k\) 为偶数时可任意重排 \(a\)\(k\) 为奇数时在下标逆序对奇偶性不变的情况下可任意重排

\(a,b\) 不为排列(离散化后),说明存在重复元素,两个相同元素之间可互换,相当于不要求奇偶性限制,因此一定合法

否则 \(k\) 为偶数时一定合法,\(k\) 为奇数时需要通过逆序对奇偶性判断

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

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(8) 1011] 最有节目效果的一集

每组战队维护一个 vector 依次保存可能合法的信息,__gnu_pbds::tree 维护优先级,容易做到 \(O(\sum n\log n)\),注意细节

代码

posted @ 2025-08-12 08:35  Hstry  阅读(8)  评论(0)    收藏  举报