Loading

【杂题乱写】2024.01 #2

Page Views Count

AtCoder-JOIOPEN2022_A シーソー

开局考虑二分,然后不会做,没想到不需要二分。

以初始的重心为基准,记为 \(mid\),可以对操作 \(i\) 次得到的所有可能区间求出重心在 \(mid\) 左侧且最靠右的以及在 \(mid\) 右侧且最靠左的两个区间,容易发现这两个区间左右端点都差 \(1\),记靠左的一个为 \([l_i,r_i]\),考虑操作 \(i+1\) 次得到的区间 \([l_{i+1},r_{i+1}]\),发现 \([l_i,r_i-1]\)\([(l_i+1)+1,r_i+1]\) 一定分列 \(mid\) 左右两侧,中间还有一个区间 \([l_i+1,r_i]\),所以 \([l_{i+1},r_{i+1}]\) 只用判断 \([l_i+1,r_i]\) 的重心位置就能求出。

对操作次数 \(i\) 计算出 \([l_i,r_i]\) 以及 \([l_i+1,r_i+1]\) 重心与 \(mid\) 的距离,按照某一维排序,枚举排序这维的最大值,后面更大的只能取另一维。

现证明这样算出的答案一定能取到,可以归纳,以此时在 \([l_i,r_i]\) 为例,在 \([l_i+1,r_i+1]\) 同理。此时如果可以走到 \([l_{i+1},r_{i+1}]\) 就走,否则走 \([l_{i+1}+1,r_{i+1}+1]\),发现不能走到 \([l_{i+1},r_{i+1}]\) 说明它就是 \([l_i,r_i-1]\),那么 \([l_i+1,r_i]\) 重心更靠右,一定能走到且合法。

提交记录:Submission - AtCoder

Luogu-P9871 NOIP 2023 天天爱打卡

因为知道这题要用线段树优化 DP,所以或多或少有意往这方面靠拢。

\(f_{i,j}\) 表示考虑到第 \(i\) 天,且当前从第 \(j\) 天开始连续打卡的最大值,这样的状态设计可以直接继承。

这里 \(f_{i,i}\) 是前 \(i-2\) 天查询到最大值中的最大值,之后先是 \([1,i]\) 前缀减去 \(d\),若 \(x_j=i\),则 \([1,x_j-y_j+1]\) 前缀加上 \(v_j\)。查询最大值是 \([\max(i-k+1,1),i]\) 的区间 \(\max\)。把操作的区间尽量一般化,只在查询位置满足 \(k\) 的限制就行了。

之后优化是离散化,发现把所有 \(x_j\) 以及 \(x_j-y_j+1\) 拿出来即可,设离散化后的序列是 \(p\),那么 \([p_{i-1}+1,p_i]\) 这一部分中最优的一定是 \(p_i\),因为这个区间拥有相同的奖励更新,而 \(p_i\) 减去最少的 \(d\) 且更容易满足 \(k\) 的限制。所以上面的操作就基本可以复制下来了,需要讨论的也许是 \(p_{i-1}+1<p_i\) 时,\(i-1\) 处查询的最大值也可以作为 \(f_{p_i,p_i}\)

提交记录:Submission - Luogu

AtCoder-ARC117_C Prefix Mex Sequence

这个填 \(\mathrm{mex}\) 实际上是没啥用的,就是限定了如果现在 \([0,m]\) 没填满就是唯一的,同时如果不填 \(\mathrm{mex}\),选择就少了一种。不妨设 \(f_{i,j}\) 表示填 \(i\) 个数其中本质不同的有 \(j\) 个。

\(s_i=1\)\(j<m+1\),则转移唯一:

\[f_{i,j+1}\leftarrow f_{i-1,j} \]

\(s_i=0\),讨论填的数之前也没有填过:

\[f_{i,j+1}\leftarrow (m-j)\times f_{i-1,j} \]

\[f_{i,j}\leftarrow j\times f_{i,j} \]

提交记录:Submission - AtCoder

AtCoder-ARC117_D Triangle Card Game

假设写在黑板上的依次是 \(a,b,c\),比较关键的是 Bob 的选择,考虑已知 \(a,b\) 后合法的 \(c\) 应该落在 \((|a-b|,|a+b|)\) 内,所以考虑对每个 \(a\),是否存在一个 \(b\) 使得这个区间里没有 \(a\) 以外的数。

把绝对值拆开,分类讨论,若 \(a\ge b\),区间 \((a-b,a+b)\),可以对每个 \(a\) 求出 \(r\) 表示极大的没有其他数的区间 \((a-r,a+r)\),这样就要求存在 \(b\le r\),即 \(b\le \min(a,r)\),那么取最小的 \(b\) 取判断即可。

\(a<b\),区间 \((b-a,b+a)\),改成对 \(b\) 求出这样的区间,那么就要 求 \(a\le \min(b,r)\),找到最大的 \(\min(b,r)\) 然后逐个判断。

可能出现 \((b-a,b+a)\) 中有数但恰好只有 \(a\) 自己的情况,此时对于每个 \(b\),有唯一可能的 \(a\),即左侧第一个,这时再判断一下 \((b-a,b+a)\) 是否只有一个数即可。

提交记录:Submission - AtCoder

CodeForces-1917D Yet Another Inversions Problem *2300

先算 \(q\) 的逆序对,乘上 \(n\) 就是 \(p\) 相同点对的逆序对数,之后由于生成序列中 \(p\) 相同数连续,\(q\) 就没有实际用处了,只关心 \(k\) 的大小。

发现如果 \(p\) 不相同的两个数指数差绝对值超过 \(18\) 就和 \(p\) 无关了,剩下的情况用树状数组维护前缀的 \(p\),拿当前的 \(p_i\) 乘上或除去 \(2\) 的幂查询即可,因为 \(p\) 都是奇数,不会出现等于等情况,非常良心。

提交记录:Submission - CodeForces

AtCoder-ARC114_C Sequence Scores

把一次操作记在左端点,且要求区间尽量小,即左右端点都是操作对应的值。考虑对每个位置分别计算,设 \(f(i,v)\) 为在 \(i\) 位置要执行 \(v\) 操作的方案数。

考虑正难则反,不合法的情况一定是某个位置 \(j<i\)\((j,i)\) 中所有元素都比 \(v\) 大,且 \(a_j=v\),结果是:

\[f(i,v)=m^{n-1}-\sum_{j=1}^{i-1}m^{n-(i-j+1)}(m-v)^{i-j-1} \]

容易 \(O(nm)\) 递推。

开始想了一手转移是卷积的 DP 啊,没啥优化前图。

提交记录:Submission - AtCoder

Luogu-P9482 NOI 2023 字符串

也是之前大致听说做法的一道题。

考虑记 \(j=i+2l-1\),那么一个必要条件是后缀 \(i\) 的字典序小于前缀 \(j\) 翻转后的字典序,这个可以中间加一个分隔符用 SA 求出来。

考虑其中不符合题目要求的情况,实际是出现不相等的位置 \([i,j]\) 内,这个限制实际是不好直接求结合 SA 的二维数点的。发现不在 \([i,j]\) 内等价于 \([i,j]\) 是回文串,那么就对每个极长偶回文判断向下拓展一位哪一侧字典序更小,之后也是一个二维数点。

提交记录:Submission - Luogu

CodeForces-1396D Rainbow Rectangles *3300

好牛的题目。

二维平面有上下左右四个限制,题目允许枚举固定左边界 \(l\),每次做扫描线。

此时对于一个固定的右边界 \(r\),已知的方案数是离散化后的区间长度乘积 \((x_l-x_{l-1})(x_{r+1}-x_r)\),剩下还需要乘一个纵坐标区间的方案数,只剩一个一维的问题了。

注意到对于每个位置 \(i\) 作为左端点时,最靠左的合法右端点 \(p_i\) 是单调的,所以答案是 \(\sum_i(L-y_{p_i})(y_i-y_{i-1})\)。把常数项拿出来,实际要维护的是 \(y_{p_i}(y_i-y_{i-1})\)

加入一个数是不好计算的,但删除是容易的,删除 \(pos\) 位置的数时,找到这个数出现位置的前驱后继 \(pre,nxt\),那么 \([pre+1,pos]\)\(p\) 就将可能扩大到 \(nxt\),是一个区间取 \(\max\) 的操作,实际 \(p\) 是单调的,所以可以直接线段树二分找到准确的赋值区间。

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

开始先想了一手容斥,结果还没有直接算好算,反难则反了属于是。

提交记录:Submission - CodeForces

Luogu-P9990 Ynoi Easy Round 2023 TEST_90

离线扫描线,从小到大枚举 \(r\),对每个位置 \(l\) 其作为左端点的所有区间的信息,查询是区间求和。

考虑修改,操作类似一个 \([last+1,r]\) 的翻转(颜色数奇偶性改变)以及 \([1,r]\) 的区间加 \(1\)。线段树维护懒标记 \(rev\) 表示是否翻转,维护 \(siz_{0/1}\) 表示这个节点的每个位置 \(p\) 对应 \([p,r]\) 颜色为奇数/偶数的分别有多少,\(rev\) 的作用是交换 \(siz_{0/1}\),这样加法就是标记把 \(siz_{0/1}\) 贡献给维护的答案 \(sum_{0/1}\)

考虑下传的细节,默认 \(rev\) 优先级高于加法标记 \(tag\)。若此时标记队列中已经有 \(rev\) 以及 \(tag\),再加入 \(rev\) 时,原来的 \(tag\) 贡献系数 \(siz_{0/1}\) 就会交换,所以改成维护 \(tag_{0/1}\) 表示 \(0\rightarrow 0,1\rightarrow 1\) 以及 \(0\rightarrow 1,1\rightarrow 0\) 的加法标记就行了,下传 \(rev\) 时把 \(tag_{0/1}\) 也交换。

实际是区间加区间翻转和区间历史和,

提交记录:Submission - Luogu

Luogu-P9989 Ynoi Easy Round 2023 TEST_69

\(\gcd\) 感觉非常势能线段树,对每个区间维护 \(\mathrm{lcm}\),那么只有 \(\mathrm{lcm}\mid x\) 时取 \(\gcd\) 才有影响,直接递归,如果 \(\mathrm{lcm}\) 很大就直接设为超过值域的值即可。

这样每个节点的势能可以看作区间内每个数质因子分解后的次数之和,那么总势能是 \(O(n\log n\log V)\),去到一个节点必然使其势能减少,因此时间复杂度是 \(O(n\log n\log V+q\log n)\)。理论上合并求 \(\mathrm{lcm}\) 也是需要一个 \(\log\) 的,但也许能势能分析掉。

提交记录:Submission - Luogu

Luogu-P9991 Ynoi Easy Round 2023 TEST_107

考虑最终的 \([l',r']\) 的特点,发现 \([l',r']\) 可能是 \([l,r]\) 的前缀或后缀,也可能满足 \(l<l'\le r'<r\)\(a_{l'-1}=a_{r'+1}\),也就是两端分别减少到某个颜色不出现为止。

第一种情况可以直接扫描线维护每个区间最新颜色的出现位置,正反各扫一次。第二种情况把每种颜色相邻出现位置拿出来求二维偏序就可以的。

提交记录:Submission - Luogu

posted @ 2024-01-18 20:13  SoyTony  阅读(59)  评论(0编辑  收藏  举报