【Atcoder】AGC007 B-F简要题解

本文深入解析算法竞赛中的策略,涵盖序列构造、动态规划难题解决、模拟策略应用、最优操作识别、树形结构处理及字符串匹配技巧。通过实例展示如何应对不同类型的算法挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B.Construct Sequences

观察数据范围:ai,bi≤109,n≤2×104a_i,b_i\leq 10^9,n\leq 2\times 10^4ai,bi109,n2×104

n2&lt;109n^2&lt;10^9n2<109,所以让构造的a,ba,ba,b公差为nnn即可。

pip_ipi就在aia_iai+(i−1)+(i-1)+(i1)即可。


C.Pushing Balls

辣鸡推式子题!(dp想半天无解)

模拟一轮的操作,发现剩下n−1n-1n1个球与坑的距离还是个等差数列(具体过程略):
每轮移动期望距离d+2n−12xd+\dfrac{2n-1}{2x}d+2x2n1,一轮完毕后d′=d+2d+5x2n,x′=x+4x2nd&#x27;=d+\dfrac{2d+5x}{2n},x&#x27;=x+\dfrac{4x}{2n}d=d+2n2d+5x,x=x+2n4x

所以这道题教会我们:推不出dp就先模拟一轮,说不定变化有规律?


D.Shik and Game

显然最优操作是每次给一段连续区间的熊喂糖,然后回到区间第一只熊的位置依次取硬币,设fif_ifi表示最后一个区间以iii结尾的最优值,转移如下:
fi=min(fj+max⁡(T,2(xi−xj+1)))f_i=min(f_j+\max(T,2(x_i-x_{j+1})))fi=min(fj+max(T,2(xixj+1)))

答案即fn+Ef_n+Efn+E

可以单调指针扫到最后一个jjj满足2(xi−xj+1)≥T2(x_i-x_{j+1})\geq T2(xixj+1)T,记录前缀和min⁡(fj−2xj+1)\min(f_j-2x_{j+1})min(fj2xj+1)。对于2(xi−xj+1)&lt;T2(x_i-x_{j+1})&lt; T2(xixj+1)<T的部分,由于fif_ifi单调不降,所以用fj+1+Tf_{j+1}+Tfj+1+T更新fif_ifi即可。


E.Shik and Travel

再一次zz地忽略了题目中的关键性质:满二叉树…

二分答案midmidmid

因为每条边只能走两次,所以要先选完子树内的叶子结点才能走别的。考虑dfsdfsdfs遍历这颗树,假设当前处理到xxx点,它到左右儿子的距离分别为v0,v1v_0,v_1v0,v1

每个结点维护一个数对(a,b)(a,b)(a,b)集合SxS_xSx,其中a,ba,ba,b分别表示根到第一个叶结点的距离和最后一个叶结点到根的距离。

对于点xxx,若左儿子集合SlS_lSl中的(a,b)(a,b)(a,b)和右儿子集合SrS_rSr中的(a′,b′)(a&#x27;,b&#x27;)(a,b)满足b+a′+v0+v1≤midb+a&#x27;+v_0+v_1\leq midb+a+v0+v1mid,则点xxx的集合中存在(a+v0,b′+v1)(a+v_0,b&#x27;+v_1)(a+v0,b+v1)

强制∣Sl∣≤∣Sr∣|S_l|\leq |S_r|SlSr(不满足的swap(l,r)swap(l,r)swap(l,r)即可),对于∣Sl∣|S_l|Sl中的每个数对(a,b)(a,b)(a,b)
SrS_rSr中找到满足b+a′+v0+v1≤midb+a&#x27;+v_0+v_1\leq midb+a+v0+v1midb′b&#x27;b最小的数对(a′,b′)(a&#x27;,b&#x27;)(a,b),将(a+v0,b′+v1)(a+v_0,b&#x27;+v_1)(a+v0,b+v1)压入SxS_xSx
SrS_rSr中找到满足b′+a+v0+v1≤midb&#x27;+a+v_0+v_1\leq midb+a+v0+v1mida′a&#x27;a最小的数对(a′,b′)(a&#x27;,b&#x27;)(a,b),将(a′+v1,b+v0)(a&#x27;+v_1,b+v_0)(a+v1,b+v0)压入SxS_xSx

∣Sroot∣&gt;0|S_{root}|&gt;0Sroot>0,则有解。

∣Sx∣≤2∣Sl∣|S_x|\leq 2|S_l|Sx2Sl,类似于启发式合并,时间复杂度O(nlog⁡2n)O(n\log ^2n)O(nlog2n)


F.Shik and Copying String

TTT分成若干个内部字符相同的段。对于每段[l,r][l,r][l,r]的开头lll,找到最大的iii满足i≤li\leq lilS0[i]=T[l]S_0[i]=T[l]S0[i]=T[l],那么这一段必然由S0[i]S_0[i]S0[i]转移而来。

贪心地看,我们应该倒序逐次地转移得到TTT的每个段:

在这里插入图片描述
红色表示最终转移到的区间,从上到下依次是S0,S1,S2,S3S_0,S_1,S_2,S_3S0,S1,S2,S3

特判掉S0=TS_0=TS0=TSl=SiS_l=S_iSl=Si的情况(答案分别为0,1),那么其它情况都存在折线重叠。

考虑双端队列qqq维护重叠折线,答案即过程中双端队列大小最大值+1(加上折线到lll后拓展到rrr的一步):

考虑加入当前的点iiiq[head]q[head]q[head]怎样才会限制到iii呢?

假设当前加入333号点,双端队列中元素为1,21,21,2,可以发现在111的限制下,333在第二次转移后最多只能拓展到q[head]−(head−tail)q[head]-(head-tail)q[head](headtail)的位置——若l3l_3l3在这个位置之前,那么q[head]q[head]q[head]就限制不到333了。

不断弹出队首直至满足q[head]−(head−tail)≤l3q[head]-(head-tail)\leq l_3q[head](headtail)l3或者队列为空,然后将333加入队尾。并在过程中不断用head−tail+1head-tail+1headtail+1更新ansansans

答案即ans+1ans+1ans+1

AtCoder Beginner Contest 134 是一场 AtCoder 的入门级比赛,以下是每道题的简要题解: A - Dodecagon 题目描述:已知一个正十二边形的边长,求它的面积。 解题思路:正十二边形的内角为 $150^\circ$,因此可以将正十二边形拆分为 12 个等腰三角形,通过三角形面积公式计算面积即可。 B - Golden Apple 题目描述:有 $N$ 个苹果和 $D$ 个盘子,每个盘子最多可以装下 $2D+1$ 个苹果,求最少需要多少个盘子才能装下所有的苹果。 解题思路:每个盘子最多可以装下 $2D+1$ 个苹果,因此可以将苹果平均分配到每个盘子中,可以得到最少需要 $\lceil \frac{N}{2D+1} \rceil$ 个盘子。 C - Exception Handling 题目描述:给定一个长度为 $N$ 的整数序列 $a$,求除了第 $i$ 个数以外的最大值。 解题思路:可以使用两个变量 $m_1$ 和 $m_2$ 分别记录最大值和次大值。遍历整个序列,当当前数不是第 $i$ 个数时,更新最大值和次大值。因此,最后的结果应该是 $m_1$ 或 $m_2$ 中较小的一个。 D - Preparing Boxes 题目描述:有 $N$ 个盒子和 $M$ 个物品,第 $i$ 个盒子可以放入 $a_i$ 个物品,每个物品只能放在一个盒子中。现在需要将所有的物品放入盒子中,每次操作可以将一个盒子内的物品全部取出并分配到其他盒子中,求最少需要多少次操作才能完成任务。 解题思路:首先可以计算出所有盒子中物品的总数 $S$,然后判断是否存在一个盒子的物品数量大于 $\lceil \frac{S}{2} \rceil$,如果存在,则无法完成任务。否则,可以用贪心的思想,每次从物品数量最多的盒子中取出一个物品,放入物品数量最少的盒子中。因为每次操作都会使得物品数量最多的盒子的物品数量减少,而物品数量最少的盒子的物品数量不变或增加,因此这种贪心策略可以保证最少需要的操作次数最小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值