2024年12月随便做做
测试题目选集
暂无。
Miscellaneous
[清华集训2016] Alice 和 Bob 又在玩游戏
考虑计算子树作为一个有向图游戏时的 SG 函数值。根据 SG 函数的定义,应该有:
感觉有点棘手,不妨做一步简单的转化:
然后就是每个点初始集合中有一个 \(s(i)\),同时从下往上将 \(u\) 的所有儿子的集合内的值异或上 \(s(u)\) 后加入 \(u\) 的集合中,同时 \(SG(u)\) 应该等于此时这个集合的 \(\mathrm{mex}\)。这个可以使用一些数据结构简单做到 \(O(n\log_2^2 n)\),比如启发式合并。不过更符合异或思路的应该是时间复杂度 \(O(n\log_2 n)\) 的 01trie 合并。
[BZOJ2121] 字符串游戏
考虑实际上应该是求出 \(f(l,r)\) 表示是否可以只删掉 \([l,r]\) 中的所有字符就可以求出答案。
随便搓一下,可以得到一个 \(O(|L|^4\sum |p|)\) 的区间 dp,但是考虑似乎计算区间内的删除关系对于每个 \((l,r)\) 单独计算有点奢侈了。
考虑记 \(g(l,r,i,j)\) 表示 \([l,r]\) 删成只剩第 \(i\) 个字符串的前 \(j\) 个字符。
发现 \(g(l,r,i,j)\leftarrow g(l,r-1,i,j-1)\) 或 \(g(l,r,i,j)\leftarrow g(l,k,i,j) | f(k+1,r)\)。而且 \(f(l,r)\leftarrow g(l,r,i,|p_i|)\),于是可以得到一个 \(O(n^3\sum |p|)\) 的做法。
[SDOI2010] Auction 代码拍卖会
记 \(f(x)=(f(x-1)\times10+1)\mod p\)。考虑这个题目要求的充要条件就是选出一个大小小于等于 \(8\) 的可重集 \(s\),使得:
因为 \(p\) 很小所以可以背包解决,时间复杂度 \(O(|\Sigma|^3p^2)\),其中 \(|\Sigma|\) 为可重集最大大小,为 \(8\),因此可以通过此题。
Atcoder AGC018C - Coins
考虑只有三种硬币,因此应该具有特殊性。考虑只有两种时怎么做。简单的做法是先所有都取 \(a_i\),然后选 \(b_i-a_i\) 最大的几个变成取 \(b_i\)。另外还有一种思考,就是对于 \(i,j\) 而言,如果两个中只有一个是 \(a_i\),那么如果 \(a_i+b_j\) 更优的话,那么就有 \(a_i+b_j\ge a_j+b_i\),即 \(a_i-b_i\ge a_j-b_j\)。那么这个是有传递性的,所以可以按照 \(a_i-b_i\) 排序后前 \(x\) 个选 \(a\),后 \(y\) 个选 \(b\)。
将两者均运用在此题上,发现可以先全部选 \(a_i\),然后让 \(b_i\leftarrow b_i-a_i,c_i\leftarrow c_i-a_i\)。然后就是选 \(y+z\) 个位置,其中 \(y\) 个给答案贡献 \(b_i\),\(z\) 个给答案贡献 \(c_i\)。然后可以运用到第二种思考,考虑 \(b_i+c_j\ge b_j+c_i\) 时应该有 \(b_i-c_i\ge b_j-c_j\),于是排序之后找到断点使得前面选 \(y\) 个 \(b\) 和后面选 \(z\) 个 \(c\) 的总和最大。这个可以用优先队列预处理。
总的时间复杂度是 \(O((x+y+z)\log_2(x+y+z))\)。
Submission #60424071 - AtCoder Grand Contest 018
补:似乎还可以使用模拟费用流?
QOJ #6550. Elimination Race
寻找对每个人而言的充要条件。考虑现在考虑的人是 \(t\),那么就对于每一行建一个点,然后这个点向这行所有比 \(t\) 菜的人代表的点连边。这样就构成了左右各 \(n-1\) 个点的二分图。为了满足末尾淘汰的题目要求,同时给每个行代表的点(左部点)定一个出边顺序,表示如果选择这个点,则会按照出边的顺序找到第一个未选择的右部点并且与其匹配。原题相当于对于每个 \(t\) 求出选左部点的顺序使得每个点都被匹配,或者确定没有这样的点。
然后会发现如果可以确定一个顺序,那么显然一定存在完美匹配。那么如果存在完美匹配,是否一定存在这样一个顺序?考虑构造:
- 任意找一个完美匹配。然后初始认为所有点都没有被移走。
- 新建一个只有点的图。对于所有没有选择的左部点,找到按照出边顺序最靠前的没有被移走的右部点 \(v\),记这个左部点原本连接的是 \(v_0\)。在新图中连一条 \(v_0\to v\) 的有向边。因为所有的点都肯定在匹配内,所以最终所有没有被移走的右部点对应在新图上构成了一棵内向基环树森林。发现对于一个环来说,如果把环上的点循环位移之后再对应在原图中的匹配关系,会发现可以直接把这些新的匹配关系输出(因为指向的是没移走的最优先的点,所以这些环上的点按照什么顺序输出都无所谓),同时把相关的点移走。
- 重复上个步骤,直到原图中没有点。
这样就可以根据完美匹配构造出解。时间复杂度为 \(O(n^4)\),瓶颈在于枚举 \(t\) 之后找到完美匹配的匈牙利算法。考虑可以使用 bitset 优化,时间复杂度 \(O(\frac{n^4}{w})\),可以通过。
考虑扩展这个问题,如果对于每个人都想求出自己存活时最多可以淘汰多少个人。我们猜测答案等于最大匹配数。事实也是如此。记答案为 \(w\),那么根据方案应该可以构造出大小为 \(w\) 的匹配,说明最大匹配应该大于等于 \(w\)。同时对于任意一个最大匹配,实际上也可以类似上述构造方法地构造出答案。但是具体细节略有不同。
具体来说,区别在于匹配数 \(<n-1\) 时,步骤 2 中的新图可能会出现这种情况:存在一条边 \(u\to v\),但是 \(v\) 却没有出边。此时不构成基环树森林(反之一定构成),但是会发现可以直接在原图中将对应匹配 \((p,u)\) 变成 \((p,v)\) 并删除,不影响其他匹配并且合法。其他情况就是上述构造方法。
时间复杂度仍然是 \(O(\frac{n^4}{w})\)。
还有一种理解方式(或者说构造方法),是直接在 dfs 形式的匈牙利的性质下确认方案,但是优化较为困难,只能做到 \(O(\frac{n^4\log_2 n}{w})\)。
QOJ #1250. Tokens
比较优秀的题目。实际上的难度不大但是提醒了我应该重视基础了。考虑每个 token 原本处于 \((i,j,k)\),操作完成后处于 \((i',j',k')\),满足 \(i\le i',j\le j',k\le k'\)。并要求 \((i,j,k)\) 位置上有 \(b_{i,j,k}\) 个 token。
偏序关系实际上是非常有性质的形式。考虑可以把 token 的前后出现当作是将每个位置拆成 \(a_{i,j,k}+b_{i,j,k}\) 个点之后 \(a\) 部分和 \(b\) 部分满足偏序的匹配。那么就是求出完美匹配。
考虑完美匹配的充要条件霍尔定理,那么如果选出了一个集合 \(S\) 代表左部点也就是 \(a\) 部选出的集合,那么应该有:
考虑可以把 \((i',j',k'),\exists (i,j,k)\in S,i\le i',j\le j',k\le k'\),所有的 \((i',j',k')\) 加入 \(S\) 中,左边变大而右边不变,限制更严格,因此可以替换这个充要条件。设上述新的集合为 \(S'\),则应该有:
而 \(S'\) 应该满足若 \((i,j,k)\) 在 \(S'\) 中,则所有偏序大于等于 \((i,j,k)\) 的点均在 \(S'\) 中。这个 \(S'\) 反映在图像上应该是一个很特殊的阶梯状。而每一层的情况应该只有 \({B+C-1\choose B-1}\) 种,这个数并不大,因此可以 dp。
注意到实际上如果 \((i,j,k)\in S\),而 \(\not\exists (i',j',k')\in S,i'\le i,j'\le j,k'\le k\) 那么必须要有 \(a_{i,j,k}>0\) 才是一个合法的集合,可能需要在 dp 中判定。但是注意到我们的限制是 \(\sum b- \sum a\) 最小,因此加入这个点是严格不优的,因此 dp 中不考虑这个仍然是对的。
时间复杂度 \(O(\sum nm^2+\sum nm{2m-1\choose m-1})\)。
QOJ #7504. HearthStone
首先将 \(a\) 排序,显然存在一种最优方案使得 \(a\) 操作前后相对大小不变。
那么记 \(f(i,j)\) 表示使用前 \(i\) 个 \(a\) 满足从 \(1\) 到 \(j\) 的每个数至少出现一次且最大数为 \(j\)。那么应该有转移:
- 当 \(a_{i+1}>j\) 时 \(f(i+1,j)\leftarrow f(i,j)\) 的转移的后续一定不会成为答案即最小值,所以只有一种转移 \(f(i+1,j+1)\leftarrow f(i,j)\)。
- 当 \(a_{i+1}<j\) 时因为 \(\forall k<i+1:a_k\le a_{i+1}\),所以 \(j\) 一定是被一个小于等于 \(a_{i+1}\) 的数填上的,那么如果这个数填上了 \(j\) 而 \(a_{i+1}\) 还要移动过去填 \(j\) 显然是不优的。所以仍然只有一种转移 \(f(i+1,j+1)\leftarrow f(i,j)\)。
- 当 \(a_{i+1}=j\) 时两种转移都可以操作。
那么会发现这个转移非常地特殊,而且每次转移的目标状态相交的部分应该是常数大小。因此可以记录一个扫描的指针来维护 \(<j\) 和 \(>j\) 的转移,剩下的部分手动转移就可以了。
细节见代码。似乎还可以用栈实现。而且这题有很多做法,但是这种做法是 \(O(n+V)\) 的,跑得非常快。
QOJ #7578. Salty Fish
设计 dp 状态为 \(f(x,y)\) 表示点 \(x\) 子树内选的点深度最小大于等于时的最大答案。两条长链上的 \(f\) 的合并可以直接相加。问题在于摄像头的限制,考虑实际上时将 \(f(x,<d)\) 的位置减去一个值 \(cost\),那么可以维护 \(f\) 的从深度大的深度小的差分,这个操作就变成了单点加,因为是后缀 min,所以不允许某个位置是负数差分,因此负数差分应该移动到之后的最靠近的正数上面去减。同时会发现这样的维护非常巧妙,因为差分的个数总共只有 \(O(n)\) 个,因为总共会加入 \(O(n)\) 次,每个只会被删除一次。势能分析可得时间是 \(O(n)\) 的,但是为了维护负数的消去需要加上一个数据结构,实际复杂度为 \(O(n\log_2 n)\)。
QOJ #2621. First Occurrence
神奇的性质题。手摸之后发现如果长度 \(>3\) 则字符相同的区间的左端点的奇偶性是一致的。记 \(f(l,r)\) 表示 \([l,r]\) 的答案。那么应该有:
时间复杂度 \(O(T\log_2 n)\)。
QOJ #1359. Setting Maps
应该从最小割的方向去考虑,记 \((v,x)\) 表示点 \(v\) 在之后还要经过 \(x\) 个关键点才会合法,然后拆成两个点,\(in(v,x)\to out(v,x)\) 连边容量为 \(c_v\),同时 \(in(v,x)\to out (v,x-1)\) 连边容量为 \(\infty\) 表示如果不设 \(v\) 为关键点是就有 \(in(v,x),out(v,x)\) 联通,否则就只有 \(in(v,x)\) 和 \(out(v,x-1)\) 联通。同时把原图的边也在流网络上表示。显然求 \(\{in(S,0),in(S,1),\cdots,in(S,k)\}\) 和 \(out(E,1)\) 的最小割就行了。
[PA2009] Quasi-template
非常不错的题目,实际上不难但是在最优的实现上考察了对字符串算法的熟练运用的能力。
首先的一点是,如果一个长度为 \(l\) 的串合法的话,那么它所在的 endpos 等价类的所有 endpos 向前覆盖 \(l\) 的长度一定能覆盖除首尾两端的两段之外的所有位置。同时,因为串可以由 endpos 等价类和长度唯一确定,所以实际上可以考虑枚举每个等价类再做考虑。
接下来应该是对于首尾分别讨论,记这个 endpos 等价类上答案串的长度为 \(l\),显然 \(l\) 应该大于等于相邻 endpos 位置差的最大值(这个可以用 parent 树上的线段树合并来维护)。
先考虑开头,记最靠前的 endpos 位置为 \(L\),那么对于 \(l\) 应该存在一个长度小于等于 \(l\) 的后缀使得它是原串的前缀且这个前缀和 \([L-l,L]\) 有交。这是一个非常恶心的限制,一种比较蠢的转化就是发现这个前缀的长度应该大于等于 \(\lceil \frac{n}{2} \rceil\),此时一定与 \([1,L]\) 的后缀有交,反之一定没有交,所以只需要找到长度大于等于 \(\lceil\frac{n}{2} \rceil\) 的长度最小的相等前后缀,记为 \(d\),那么需要 \(l\ge d\)。但是这样比较愚蠢(虽然也可以 \(O(1)\) 求出,但是比较麻烦),考虑因为 \(L\) 是最靠前的 endpos 位置,那么 \(border[1,L]\) 必定小于这个 endpos 等价类上的最小长度 \(minlen\),否则可以在前面找到更靠前的 endpos。所以只需要满足 \([1,border[1,L]]\) 和 \([L-l,L]\) 有交就可以了。得到 \(L-l \le border[1,L],l\ge L-border[1,L]\)。
然后考虑末尾的限制,记最靠后的 endpos 的位置为 \(R\),那么对于 \(l\) 的限制在于 \(l> n-R\),同时有 \(border[R-l+1,n]\ge n-R\)。
那么我们可以在区间 \([R-maxlen+1,R-\min\{l\}+1]\) 上的每个位置打一个标记 \((x)\),表示如果 \(border[p,n]\ge x\) 就对答案贡献 \(1\)。
这个可以离线之后树状数组维护。对于最小长度,可以在标记中额外加入右端点表示 \(R\),这样可以对每个位置求出右端点的最小值,之后就好做了。
时间复杂度 \(O(n\log_2 n)\)。
QOJ #6119. Frustration and Bracket Sequences
首先,对于一个左右括号不等的序列,显然应该补最少的括号把它补成左右括号相同的序列。
考虑把左括号变成 \(+1\),右括号变成 \(-1\),那么一个序列就可以看作一个折线图,记一个点的高度是 \(h_i\),有 \(h_0=0\),\(h_i=h_{i-1}\pm 1\)。画一条代表 \(0\) 的高度,那么就是让所有低于 \(0\) 的点不低于 \(0\)。发现将 \(()\) 交换成 \()(\) 是显然不优的。那么就是每次将 \()(\) 变成 \(()\)。考虑在折线图上就是将一个向下的尖变成向上的尖。稍加分析就可以得出是对于左括号的位置集合 \(S\) 求 \(\sum_{i\in S}\max (0,-h_i+1)\)。然后这个就可以分块做了。
时间复杂度 \(O(n\sqrt n)\),喜提最劣解。
upd:现在不是最劣解了。
QOJ #8435. Empty Vessels
理论上算简单题?但是被卡住了很久。显然可以猜测答案是最大公因数的倍数。必要性显然。考虑构造。记最大的瓶子容量是 \(V\),那么可以发现如果可以实现 \(u\) 可以被操作出来的时候,\(\forall i:(u+a_i)\mod V\) 可以被操作出来,就可以说明充分性了,而且还可以顺便得到一组构造解。
- 考虑 \(u+a_i<V\) 时,将 \(u\) 放在容量最大的 \(a_I=V\) 的瓶子 \(I\) 处,要求 \(I \ne i\)(若 \(i=I\) 也没有意义),则直接装满 \(i\) 再倒入 \(I\) 就行。这样显然时可以满足的。
- 考虑 \(u+a_i\ge V\) 时,其实求的应该是 \(u+a_i-V\),所以可以把 \(u\) 放在 \(I\) 处,然后装满 \(i\) 再倒满 \(I\),\(i\) 中剩余的就是 \(u+a_i-V\)。
可以 bfs 求出是否可行以及一组解,时间复杂度 \(O(V\cdot n)\),可见 \(A\le 5\) 是唬人的。
QOJ #7580. Milk Candy
先说下个人对拟阵的理解(只有关键部分):
拟阵 \(M=(E,\mathcal{I})\) 是关于基础集 \(E\) 以及其独立集 \(\mathcal{I}\) (集族)的一个抽象代数结构。满足 \(\forall I \in \mathcal{I},I\sube E\) 和以下性质:
- 非空性:\(\empty \in \mathcal{I}\)。
- 遗传性:\(\forall J\sub I,I\in \mathcal{I}:J\in \mathcal{I}\)。
- 扩张性:\(\forall I,J\in \mathcal{I},|I|<|J|:\;\;\exists i\in J - I:I\cup \{i\}\in \mathcal{I}\)。
拟阵理应由 \(E\) 和 \(\mathcal{I}\) 组成,但是通常情况下, \(\mathcal{I}\) 是通过 \(E\) 以及一个满足拟阵要求的性质 \(Q\) 生成,否则就较难有比较好的实用意义。
也就是说,\(E\) 是不能确定 \(\mathcal{I}\) 的,而 \(\mathcal{I}\) 和 \(Q\) 从结果上说是等价的,有其中一个就可以唯一确定一个拟阵。
在 OI 中常用的拟阵是图拟阵和有色拟阵。
-
图拟阵是基础集为边集 \(E\) 的拟阵,满足 \(Q(I)=[I 中不存在环]\),\(\mathcal{I}\) 为所有构成森林的边集的集族,考虑一下情况建立在图为连通无向图这一条件上。
考虑显然这个拟阵的基应该是所有生成树边集构成的集族。而它的圈显然是所有简单环的情况,而 \(r(S)\) 显然表示边集 \(S\) 的关联点集的大小减去连通块大小,而 \(r(E)=n-1\)。
考虑 \(\forall I,J\in \mathcal{I},|I|<|J|\) 时,显然可以加 \(J-I\) 中的某个元素入 \(I\) 中之后满足 \(I'\) 也是森林。
而图拟阵的对偶拟阵 \(M^{*}=(E,\mathcal{I}^*)\) 对应的性质 \(Q^{*}\) 则是 \(Q^*(I)=[E-I 使得图连通]\),看似是非常无用的性质,实则可以解决本题。
-
有色拟阵是基础集为 \(E\) 的拟阵,满足 \(E\) 中的每个元素在等价关系 \(R\) 下可以分在某个等价类中。而对于每个等价类 \(T\) 设置一个值 \(f(T)\),而后 \(Q(I)=[对于所有等价类 T,\sum_{i\in I}[i\in T]\le f(T)]\),会发现显然满足拟阵的三个性质。
然后再说说拟阵求交的最大权最大独立集(只有算法,并非会证明)。
对于两个拟阵 \(M_1=(E,\mathcal{I}_1),M_2=(E,\mathcal{I}_2)\)。考虑求最大独立集的同时权最大,满足 \(I\in \mathcal{I}_1,\mathcal{I}_2\)。
-
初始让 \(I=\empty\)。
-
建出交换图:对于 \(u\in I,v\in E-I\),\(u\to v\) 存在当且仅当 \(I-\{u\}+\{v\}\in \mathcal{I}_1\),\(v\to u\) 存在当且仅当 \(I-\{u\}+\{v\}\in \mathcal{I}_2\)。同时记录一个点的点权为 \((-1)^{[u\in I]}w(u)\)
-
考虑所有的起点 \(x\) 满足 \(x\in E-I,I+\{x\}\in \mathcal{I}_1\) 而终点满足 \(x\in E-I,I+\{x\}\in \mathcal{I}_2\)。求出点权最大的同时经过的点最少的路径,然后将路径上 \(I\) 内的点在新的 \(I\) 中删去,加入 \(E-I\) 的点。
-
如果存在这样的路径,就重复 2. 3. 4. 否则结束,\(I\) 在结束时就是满足是最大独立集且权最大。
在判断形如 \(S\in \mathcal{I}\) 这样的关系时可以不需要真的求出 \(\mathcal{I}\) 而只需要判断 \(Q_{\mathcal{I}}(S)\) 的答案就行了。
然后就进入了本题的环节。考虑对于区间 \([l,r]\) 的和等于前缀和的差 \(s_r-s_{l-1}\),因此将 \(l-1,r\) 连边,如果已知 \(s_{l-1}\) 或者 \(s_r\) 和这条边,那么就可以知道另一个的值。那么实际上相当于时每个边集选出恰好选 \(k\) 条边,且最后图连通的情况下使选出的边权和最小。
考虑因为边权非负,所以多选一定不优。因此我们发现选出边集的补集一定会在一个可构造的有色拟阵中,且是这个拟阵的基。
但是另外一方面,要求选出的边连通,考虑边集的补集或者说是图拟阵的对偶拟阵。意思就是我们可以选出一些边使得剩下的边连通,这是图拟阵的对偶拟阵。然后我们会发现,我们只需要求出图拟阵的对偶拟阵和有色拟阵的交的最大权最大独立集,然后判断是否这个独立集是否是有色拟阵的基就可以了。
正确性在于有色拟阵的基满足的个数最大,我们求出的独立集也是个数最大,如果求出的独立集个数小于有色拟阵基的个数,那么说明不能仅仅选 \(k_i\) 条边满足限制,因此返回不存在,否则一定是每个边集恰好出现了 \(c_i-k_i\) 个,那么满足题目的要求。
时间复杂度 \(O(n^3\alpha(n))\)。
Codeforces 2048H. Kevin and Strange Operation
考虑每个位置最后一定是某一段区间的 \(\max\),因此考虑记最终的 \(i\) 位置是由区间 \([l_i,r_i]\) 贡献得到。
那么考虑删去一个位置对答案的影响:如果删去 \(p\),那么对于新的 \(l'\) 和 \(r'\) 应该有:
- \(\forall p\le i<n: l'_i=l_{i+1},r'_i=r_{i+1}\)。
- \(\forall 1\le i<p:l'_i=l_i,r'_i=r_{i+1}\)。
会发现每次相当于在 \(r\) 中把 \(r_1\) 去掉了,在 \(l\) 中把 \(l_p\) 去掉了。
那么实际上最后的 \(l,r\) 应该形如 \(r=\{k,k+1,k+2,\cdots,n\}\),而 \(l\) 只需要是一个单调递增的序列就行了。考虑可以倒着 dp,考虑只需要对于每个位置预处理出他前面第一个 \(1\) 的位置就可以了。然后就可以轻易做到 \(O(n\log_2n)\) 的实现。但是显然存在更简单的实现可以做到 \(O(n)\),就是使用指针记录后缀和。
Submission #298184555 - Codeforces
Codeforces 1427G. One Billion Shades of Grey
考虑首先每个位置上的数只可能是给出的数的其中一个。
然后猜一个结论,考虑对于值域上相邻的两个数的大小关系做最小割,将所有的相邻数计算出最小割乘上差之后加起来就是答案。然后就过了,当然需要一定程度的网络流技巧。
然后考虑怎么证明这个结论。
考虑一个不算严谨的证明,如果不满足结论,那么一定存在一个位置,在前面某个最小割中在左侧,在之后某个最小割中在右侧。那么考虑前面一次的最小割时他在左和在右的贡献 \(x,y\),会发现如果 \(x>y\) 则之后显然是在左更优,否则显然在前一次最小割中他也在右。
考虑另一个证明,每次我们加入一个在式子中加入形如 \(|x_i-x_j|\) 或者 \(|x_i-\lambda|\) 的式子,那么由于要取最小,绝对值和式会调整成每段都取到最小值,然后就显然可以归纳法证明。
Submission #298380943 - Codeforces
Atcoder ABC386G - Many MST
较为清新的中档题,某位昵称 B 开头的 B 先生没有做出这个题,甚至 F 都没有写完,我不得不狠狠地嘲讽这位 B 先生了。
考虑如果一个图,仅考虑小于等于 \(k\) 的边时,构成若干个极大连通子图。考虑每个极大连通子图的点以及它们之间的边在这张图的任意一个最小生成树中都会构成一棵子树,包含这个极大连通子图的所有点,而且所有边的的大小都小于等于 \(k\)。
考虑求一张图的最小生成树的边权和可以表示成:\(m(n-1)-\sum_{k=0}^{m-1}\sum_{S\in \mathcal G(k)} (|S|-1)\),其中 \(\mathcal G(k)\) 表示原图仅考虑小于等于 \(k\) 的边使构成的极大连通子图的点集的集族。
然后考虑到所有情况上可以得到:
其中 \(c(i,j)\) 表示 \(i\) 个点的完全图,每条边的边权从 \(1\) 到 \(m\) 中任意选择,最后小于等于 \(j\) 的边可以使整个图连通的方案数。显然有递推式:
然后就可以在 \(O(n^3)\) 或者 \(O(n^2\log_2 n)\) 的时间复杂度内解决这个问题。
Submission #61251939 - AtCoder Beginner Contest 386
Atcoder ARC141D - Non-divisible Set
有点不知道是怎么想到这一步的,但是考虑划分出来若干等价类,每个等价类中只能选择一个数,而等价类之间互相有限制。这样我们就将不熟悉的问题转化成了熟悉的情况。我们将多对多的问题转化成了多对一,感觉是好做一点了。
考虑 \(x=2^{p}\cdot r\),要求 \(2\nmid r\),那么就相当于是划分出了 \(m\) 个不同的等价类,每个等价类恰好包含一个奇数。那么如果有 \(x^{p_1}r_1,x^{p_2}r_2\),那么如果有 \(r_2 | r_1\) 那么只有 \(p_1<p_2\) 才会合法,反过来也是一样的。那么我们对于每个等价类 \(r_i\),在合法的前提下可以求出它的上界 \(l_i\) 和下界 \(r_i\),满足 \(p_i\) 在 \([l_i,r_i]\) 中的时候都存在合法的方案。然后对应判断就可以了。
Submission #61230752 - AtCoder Regular Contest 141
Atcoder ARC141F - Well-defined Abbreviation
考虑假如 \(s_i\) 不存在一种被自己以外的其他字符串消成空串的方案,但同时又可以被消至少一次,那么直接输出 Yes 就可以了,因为如果 \(T=s_i\),那么就会有至少两个不同的结果,一个是空串而另一个不是。
所以现在任意 \(s_i,s_j\) 就都不存在包含关系了。
然后会发现,如果存在 \(s_i,s_j\) 满足 \(s_i\) 的某个后缀等于 \(s_j\) 的前缀,且剩余的部分不相同,那么一定答案就是 No,因为如果将公共的部分放在中间,剩余的分别放在两边,那么分别消去 \(s_i,s_j\) 之后,首先因为没有包含,所以不能继续消了,其次是剩余部分不相同,所以显然答案是 No。
如果不存在呢?考虑归纳法证明,加入长度小于等于 \(|T|\) 的串都满足了只有一个最终结果的条件。此时如果 \(T\) 在两种情况中消去了两段串,如果他们在位置上有交,那么剩余部分一定是一样的。否则,因为他们的最终结果只有一个,所以在下一步中可以消掉的对方上次消掉的位置,所以实际上是没有影响的,所以显然答案是 Yes。
Submission #61250233 - AtCoder Regular Contest 141
Atcoder AGC044E - Random Pawn
考虑记录答案为 \(f_i\),表示从 \(i\) 出发的期望。会发现有 \(f_i=\max (a_i,\frac{f_{i-1}+f_{i+1}}2 -b_i)\)。
考虑可以构造一个 \(c_{i}=\frac{c_{i-1}+c_{i+1}}{2}-b_i\),那么就可以有 \(f_{i}-c_i = \max (a_i-c_i,\frac{f_{i-1}+f{i+1}}2 -b_i-c_i)\)。记 \(g_i=f_i-c_i\),那么就会有 \(g_i=\max (a_i-c_i,\frac{g_{i-1}+g_{i+1}}{2})\)。这是一个非常理想的转移式子。但是很遗憾,在环上这个性质是不成立的。因为形如 \(c_{i-1}-2c_i+c_{i+1}=2b_i\) 的 \(n\) 个方程实际上是线性相关的,所以 \(c_i\) 对于 \(i=1,\cdots ,n\) 均满足限制的条件是所有 \(b_i\) 全为 \(0\)。
但是注意到,如果钦定某个位置 \(x\) 不会被转移并对此处的 \(c\) 任意赋值,那么其他的部分是可以全部满足 \(c_i\) 的条件的,而且如果设 \(c_{x+1}=y\) 的话,可以得到所有位置关于 \(y\) 的形如 \(ky+t\) 的表达,而且 \(y\) 是容易求出的(由于特殊的性质),这样就得到了其他部分的 \(c_i\)。然后会发现,让 \(x\) 等于 \(a_i\) 最大的任意一个 \(i\) 就可以满足限制。
然后回到 \(g_{i}=\max (a_i-c_i,\frac{g_{i-1}+g_{i+1}} 2 )\) 的条件,显然这一部分是简单的。不妨设 \(a_1\) 是最大的 \(a\),那么断环为链之后可以求出 \(a_i-c_i\) 的凸包,那么 \(g_i\) 就是 \(x=i\) 与凸包的交,当然 \(g_1=g_{n+1}=a_1+c_1\)。剩余的部分是简单的。
本文作者:saubguiu
本文链接:https://www.cnblogs.com/imcaigou/p/18588131
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步