做题记录 25.8.5

\(\textcolor{purple}\odot\) CF1621F Strange Instructions

\(L,R\) 分别为前导 \(0\) 和后继 \(0\) 的数量,令 \(Ln\) 为除了前导和后继外极大全 \(0\) 子段的长度的可重集,令 \(ct\) 为子串 \(11\) 的出现次数

枚举第一个操作为 \(2\) 还是 \(1/3\)

考虑模拟整个过程,令 \(cr\) 为当前总和,\(ret\) 为目前为止的答案,在模拟过程中尽量令操作次数更多,同时计算在这一过程中最终可能到达的答案的最大值

若当前操作为 \(2\)

  • \(ct>0\)\(ct\gets ct-1\)\(cr\gets cr+a\),即进行一次 \(2\) 操作
  • 否则无法操作,直接返回 \(ret\)

若当前操作为 \(1/3\)

  • \(ct>0\),则当前操作一定不是最后一次操作
    • 若存在 \(u\in Ln\cup\{L,R\},u>1\),则将其减一,并 \(cr\gets cr+b\),即选择一个 \(00\) 子段并对其进行操作 \(1\)
    • 否则若存在 \(u\in Ln,u=1\),则删除之,并 \(cr\gets cr-c\)\(ct\gets ct+1\),即令一个 \(101\) 变为 \(11\)
    • 否则若 \(1\in\{l,R\}\) 则令一个 \(1\) 变为 \(0\),并 \(cr\gets cr-c\)
    • 否则无法继续操作,直接返回
  • \(ct=0\),即所有 \(1\) 都不相邻
    • 若存在 \(u\in Ln\cup\{L,R\},u>1\),即存在 \(00\) 子段,则 \(ret \gets \max(ret,cr+a)\),即假设当前执行操作 \(1\),下一步无法操作,接下来的模拟是考虑当前不执行 \(1\) 后能否得到更大的答案
    • 若存在 \(u\in Ln,u=1\) 则删除之,并令 \(ct\gets ct+1,cr\gets cr-c\)
    • 否则直接返回

考虑完当前操作后 \(ret\gets \max(ret,cr)\)

预先对 \(Ln\) 排序后容易双指针维护以上过程,做到线性

总时间复杂度 \(O(\sum n\log n)\),瓶颈在于对 \(Ln\) 的排序,容易做到 \(O(\sum n)\)

代码

参考

\(\textcolor{blue}\odot\) CF1619H Permutation and Queries

用排列建成图,考虑分块,令 \(B=\sqrt n\) 为块长,令 \(nx_i\)\(i\) 下一个点,\(nxb_i=nx^b_i\)\(pr_i\)\(i\) 的上一个点

容易 \(O(B+\frac nB)\) 实现两种操作

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

代码

参考

\(\textcolor{purple}\odot\) CF1620F Bipartite Array

一个序列合法当且仅当序列可以划分为两个上升子序列

\(A_i\) 表示 \(1\sim i\) 划分为两个上升子序列,其中一个最后一个元素为 \(p_i\),另一个的最后一个元素的最小值(若只有一个则值为 \(-\infty\)),\(B_i\) 表示其中一个为 \(-p_i\),另一个的最小值

转移是容易的,记录转移的过程以输出方案

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

代码

参考

\(\textcolor{purple}\odot\) CF1617E Christmas Chocolates

对于一个 \(a>0\),取 \(k=\lceil\log_2 a\rceil\) 时,\(2^k-a<a\)\(a\)\(2^k-a\) 连边,显然得到一棵以 \(0\) 为根的内向树

转化为给定树上 \(n\) 个点,求包含它们的最小连通块的直径

找到距离 \(1\) 最远的点,然后找到与这个点最远的点

容易 \(O(n\log V)\) 实现(显然树高为 \(O(\log V)\) 的)

代码

\(\textcolor{blue}\odot\) CF1617D2 Too Many Impostors (hard version)

令好人为 \(1\),坏人为 \(0\),则一次询问相当于求三者中的众数,记为 \(\text{qry}(a,b,c)\),最终要求出整个序列,令答案为 \(rs\)

\(n\) 个位置划分为 \(\frac n3\) 组:\([1,2,3],[4,5,6],\cdots,[n-2,n-1,n]\),每组询问一次,令其答案为这一组的值

由于 \(0\) 的数量在 \((\frac n3,\frac {2n}3)\) 中,因此必然存在一组的值为 \(0\),且必然存在一组值为 \(1\),令 \([3p-2,3p-1,3p]\) 为一组值为 \(0\) 的组,令 \([3q-2,3q-1,3q]\) 为值为 \(1\) 的组

六个位置拼起来得到 \([3p-2,3p-1,3p,3q-2,3q-1,3q]\),分别询问相邻三个(即询问 \((3p-2,3p-1,3p)\)\((3p-1,3p,3q-2)\)\((3p,3q-2,3q-1)\)\((3q-2,3q-1,3q)\),其中第一个和第四个已经询问过了,无需重复),显然四个结果中必然存在相邻两个为 \(0/1\) 的情况,设 \(\text{qry}(s,x,y)=0\)\(\text{qry}(x,y,t)=1\),显然 \(rs_s=0,rs_t=1\)

\(\frac n3+2\) 次询问找到 \(s,t\) 后,考虑对于每组用至多两次操作确定三个位置的值

对于一组 \([a,b,c]\),其值为 \(v\)

\(\{a,b,c\}\cup \{s,t\}\ne\mathbb\emptyset\) 时,枚举 \(u\in \{a,b,c\}/\{s,t\}\),显然 \(rs_u=\text{qry}(s,t,u)\)

\(v=1\) 时,若 \(\text{qry}(a,b,s)\)\(rs_a=rs_b=1\)\(rs_c=\text{qry}(s,t,c)\),否则 \(rs_c=0\)\(rs_a=\text{qry}(s,t,a)\)\(rs_b=1-rs_a\)

\(v=0\) 时同理

总询问次数为 \(n+2\)

代码

参考

\(\textcolor{purple}\odot\) CF1615F LEGOndary Grandmaster

奇数位异或上 \(1\) 后,一次操作转化为交换相邻元素

对于确定的 \(s\)\(t\),分别令 \(a,b\) 为两者的前缀和,则操作次数为 \(\sum_{1\le i<n}|a_i-b_i|\)

\(pr_{i,j}\) 表示确定前 \(i\) 个位置,\(a_i-b_i=j\) 的方案数,令 \(sf_{i,j}\) 表示 \(i\sim n\)\((a_n-a_{i-1})-(b_n-b_{i-1})=j\) 的方案数,则答案为 \(\sum_{i,j} pr_{i,j}sf_{i+1,j}|j|\)

\(pr,sf\) 的转移是容易的

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

代码

参考

\(\textcolor{purple}\odot\) CF1615E Purple Crayon

\(F(x)=x(n-x)\),显然 \(x=\lfloor\frac n2\rfloor\) 时取到最大

分数为 \(w(r-b)=(n-r-b)(r-b)=nr-r^2-nb+b^2=F(r)-F(b)\)

将一个点 \(u\) 染为红色,则 \(u\)\(1\) 的链上所有点都无法染为蓝色,令无法染为蓝色的点数量为 \(R\),则 \(b\le n-R\)\(R\) 增大时 \(\max F(b)\) 不升

\(r\le \lceil\frac n2\rceil\) 时,\(r\) 增大时 \(F(r)\) 递增,\(R\) 不减,\(\max F(b)\) 不升,因此 \(F(r)-F(b)\) 递增,\(r\)\(\lceil\frac n2\rceil\) 时最大

\(r>\lceil\frac n2\rceil\) 时,\(R>\lceil\frac n2\rceil\),因此 \(b<\lfloor\frac n2\rfloor\),显然 \(b\) 取到 \(n-R\)\(F(b)\) 最大

\(g(r)\) 为当前 \(r\) 对应的分数,\(R_r\) 为当前 \(r\) 对应的最大的 \(R\),则 \(g(r)=F(r)-F(n-R_r)=F(r)-F(R_r)\),当 \(r<L\) 时(其中 \(L\) 为叶子数量),显然有 \(R_{r+1}-R_r\ge 1\),而显然 \(F''(x)=-2<0\),当 \(x>\lceil\frac n2\rceil\)\(F(x)\)\(x\) 增加而单调递减,因此有

\[\begin{aligned} g(r+1)=&F(r+1)-F(R_{r+1})\\ \ge &F(r+1)-F(R_r+1)\\ = &F(r)-F(R_r)-2(r-R_r)\\ \ge &F(r)-F(R_r)=g(r)\\ \end{aligned}\]

\(g\) 单调不降,因此 \(r\le L\) 时尽量取到最大

\(k\le L\)\(r\) 取到 \(k\) 最优,当 \(k>L\) 时,\(r\)\(\ge L\) 的基础上尽量接近 \(\frac n2\) 最优(因为 \(r\ge L\)\(g(r)=F(r)\)

\(R\) 的计算是容易的(长剖取前 \(r\) 大即可)

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

代码

参考

posted @ 2025-08-06 07:30  Hstry  阅读(3)  评论(0)    收藏  举报