做题记录 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\) 增加而单调递减,因此有
即 \(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)\)

浙公网安备 33010602011771号