首页 > 其他分享 >ABC 381 D~F

ABC 381 D~F

时间:2024-11-25 21:00:16浏览次数:7  
标签:suf ABC 复杂度 len 381 le 序列 长度

\(D\)

简要题意:给你一个长度为 \(n\) 的序列 \(A\) (\(1\le n\le 10^5,1\le A_i\le n\)) ,你需要找出其最长的满足以下条件的连续子序列 \(a\) 输出它的长度。

  1. 长度为偶
  2. \(a_{2*i}=a_{2*i-1} / (1\le i \le \frac{len}{2})\)
  3. 每个数出现两次。

思路:一个有趣的题,借鉴了暑假一道题的思想,那道题好像是可以将 \(a_i=a_{i+1}\) 合并为 \(a_i+1\),求最后序列的最大值。其中一步的思想就是如果有连续的 \(3\) 个相同的数连在一起那么两段必然不能连在一起,由于不确定放在哪边,直接两边都放然后中间用分隔符 \(inf\) 隔开即可。
这道题一样,连续两个的直接合并,一个的直接变成 \(inf\),三个及以上两边都放中间用 \(inf\) 分隔(因为合并后的数在子序列中只能出现一次,所以三个以上直接分隔即可)。(不要忘了序列末放一个 \(inf\))
统计 \(inf\) 之间的段的答案(满足条件的最长子序列的长度),记录上一个该颜色出现的位置,一定是选到上一个该颜色出现的位置之后一个位置即可(注意边界细节处理),因为合并后是原始两个数合成一个,所以输出答案 \(*2\) 即可。
时间复杂度 \(O(n)\)。

Code

\(E\)

简要题意:一个长度为 \(n\) 字符串 \(S\),\(q\) 次询问(\(1\le n,q\le 10^5,S_i\in \{'1','2','/'\}\)),你需要找出 \(S\) 子串 \(S_{L_i}\) ~ \(S_{R_i}\) 中最长的子序列 \(s\) (可以不连续)满足以下条件并输出其长度。

  1. 长度为奇。
  2. \(s_{\frac{len+1}{2}}='/'\)
  3. \(s_i='1'(1\le i\lt \frac{len+1}{2})\)
  4. \(s_i='2'(\frac{len+1}{2}\lt i\le len)\)

思路:考虑如果我们对于每一个 \(/\) 该如果快速求解其所产生的答案,定义 \(pre_i\) 表示 \(1\) ~ \(i\) 位 \(S\) 中 \(1\) 的个数,\(suf_i\) 表示 \(i\) ~ \(len\) 位 \(2\) 的数量,显然对于 \(S_i='/'\) 其答案为 \(\min\{pre_{i-1},suf_{i+1}\}*2+1\) 。而 \(S_{L_i}\) ~ \(S_{R_i}\) 中的 \(S_j='/'\) 其答案为 \(\min\{pre_{j-1}-pre_{L_i-1},suf_{j+1}-suf_{R_i+1}\}*2+1\)。因为取 \(\min\),所以我们希望它们尽可能平均,而 \(pre\) 在区间 \(1\) ~ \(len\) 上单增,而 \(suf\) 在区间 \(1\) ~ \(len\) 上单减,所以它的最值在第一个满足 \(pre_{j-1} \ge suf_{j+1}\) 的 \(j\) 处或最后一个满足 \(pre_{j-1} \le suf_{j+1}\) 的 \(j\) 处取得。二分即可。
时间复杂度 \(O(q\log_2 n)\)。

Code

\(F\)

简要题意:给你一个长度为 \(n\) 的序列 \(A\) (\(1\le n\le 10^5,1\le A_i\le 20\)) ,你需要找出其最长的满足以下条件的子序列 \(a\) (可以不连续)输出它的长度。

  1. 长度为偶
  2. \(a_{2*i}=a_{2*i-1} / (1\le i \le \frac{len}{2})\)
  3. 每个数出现两次。

思路:设 \(m\) 为 \(A_i\) 值的个数,考虑设立 \(dp_{i,S}\) 表示前 \(i\) 位,选取 \(A_i\) 值集合为 \(S\) 的最长长度。
转移方程显然:$$dp_{i,S}=\max_{j=1}^{i}\max_{s=1 \ && \ S&(1<<(s-1))\ne 0}^{m}{[j\lt s_{p1}\lt s_{p2}\le i]*(dp_{j,S \oplus (1<<(s-1))}+2)} (A_{s_{p1}}=A_{s_{p2}}=s)$$
时间复杂度为 \(O(n*m*2^m)\),空间复杂度为 \(O(n*2^m)\)。
时空复杂度均吃不消,但我们发现有了 \(S\) 这一维,我们可以直接知道答案就是 \(popcount(S)*2\),因为一个值不能被选两次。
于是我们不需要去记录 \(dp_{i,S}\) 表示前 \(i\) 位,选取 \(A_i\) 值集合为 \(S\) 的最长长度。可以换一种 \(DP\) 方式,将我们的第一维放进储存的值中,变为 \(dp_{S}\) 表示选取 \(A_i\) 值集合为 \(S\) 的末尾最小位数。
而转移方程变为了:$$dp_{S}=\min_{s=1 \ && \ S&(1<<(s-1))\ne 0}^{m}\min_{dp_{S \oplus (1<<(s-1))}\lt s_{p1}\lt s_{p2}\le i \ && A_{s_{p1}}=A_{s_{p2}}=s)}{s_{p2}}$$
第二个 \(\min\) 可以通过记录所有 \(s\) 值在 \(A\) 中出现的位置,二分得到。
时间复杂度 \(O(2^m*m*\log_2 n)\),空间复杂度 \(O(2^m)\)。

我们尝试感性证明一下后面的 \(DP\) 为什么是正确的,因为我们最终选取的颜色序列一定可以通过 \(DP\) 转移的顺序一个一个的往序列的后面插,所以我们只需要让最后的位置尽量靠前即可。

学习到了一个 \(trick\),如果 \(DP\) 状态复杂度特别高而值域小,可以尝试将其互换以减少复杂度。

Code

标签:suf,ABC,复杂度,len,381,le,序列,长度
From: https://www.cnblogs.com/pjt-camellia/p/18568729

相关文章

  • AtCoder Beginner Contest 381
    省流版A.按题意判断即可B.按题意判断即可C.枚举/的位置,然后分别向左右找到最长的1串和2串,然后取最小值即可D.讨论起始位置的奇偶性,然后用双指针,每两个字符每两个字符,维护出现的次数为2,两种情况取最大值即可E.答案为所有/的左右12个数的最小值的最大值,注意到个数随着/......
  • 2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest(ABCGJLN)
    文章目录N.FixingtheExpression思路codeJ.Waitingfor...思路codeC.DIY思路codeL.BridgeRenovation思路codeA.BonusProject思路codeG.GuessOneCharacter思路codeB.MakeItEqual思路codeN.FixingtheExpression思路签到题,只改变中间的字符即......
  • AtCoder ABC321F - #(subset sum = K) with Add and Erase 题解 可撤销背包
    题目链接:https://atcoder.jp/contests/abc321/tasks/abc321_f题目大意:给定大小为\(k\)的背包和\(q\)次操作,支持两种操作:插入一个大小为\(x\)的元素;删除一个大小为\(x\)的元素。每次操作后,求装满背包方案数。解题思路:可撤销背包。插入\(x\)时,fori=K->x......
  • 题解:AT_abc381_c [ABC381C] 11/22 Substring
    显然这个“11/22Substring”是以那个“/”为中心对称的。鉴于一个这样的字符串只能有一个“/”,而题目又要求最长,所以确定了“/”就能确定一个满足要求的子串。那思路就很简单了,只有两步:找到所有的“/”两边同时寻找相应的子串。别的,除了判断一下越界之外,就不用管了。......
  • MATH38161 Multivariate Statistics and Machine Learning
    MATH38161MultivariateStatisticsandMachineLearningCourseworkovember2024OverviewThecourseworkisadataanalysisprojectwithawrittenreport.YouwillapplyskillsandtechniquesacquiredfromWeek1toWeek8toanalyseasubsetoftheFMNISTda......
  • [ABC176D] Wizard in Maze
    谁没事手撸魔法方向数组啊正解:题目上说最少使用几次魔法,因此一定是正常上下左右移动的优先级更高。bfs的特点就是会先算队首,这也就意味着队首的优先级更高。从队首入队,需要使用deque。此题中的step数组用于记录到当前点用了多少次魔法。#include<bits/stdc++.h>usingn......
  • 【Atcoder训练记录】AtCoder Beginner Contest 381
    训练情况赛后反思简单题A题做红温了,怒吃6罚时,C题双指针其实差不多想出来了,但是对于判断字符串合法其实可以只判断两个端点,不需要全部遍历,中途还想了二分做法(?),然而写到最后发现并没有二分单调性。A题记得判断字符串的长度必须是奇数,\(1\sim\frac{n+1}{2}-1\)是1,\(\frac{......
  • AtCoder Beginner Contest 381
    这场比赛打的冷汗直流,然后无奈寄掉。C-11/22Substring本以为直接暴力就可以,但是需要加前缀和优化,一个正向处理,一个反向处理,然后查找/。abc381_d赛前2分钟hack掉自己的代码,然后寄掉。双指针答案必须是连续的区间,所以想到双指针维护区间合法性,但需要处理以下细节:\(a_r\n......
  • ABC375 Review
    ABC375ReviewAB模拟题过C很让人恼怒的一道题,思路一点也不难想,但是代码实现过于困难了(对于我来说)分析自己找一两组样例就会发现这道题实际上实在模拟一个矩阵不断向内旋转\(90°\)的过程,从外到里旋转的次数越来越多,旋转的过程可以发现实际上可以通过模\(4\)来进行简化......
  • [ABC227H] Eat Them All 题解
    唐唐题。思路容易发现,我们只要知道了一条边总共经过了多少次(不计方向),我们就可以跑欧拉回路。自己手玩一下,发现只要枚举四个变量,其他的都可以用方程解出来。求完之后,还需要判一下联通性。实际效率是很快的,远远跑不满。时间复杂度:\(O(a_i^4)\)。Code#include<bits/stdc++.h......