首页 > 其他分享 >ABC 384(A~F)

ABC 384(A~F)

时间:2024-12-22 22:23:24浏览次数:4  
标签:pre suf ABC res sum 384 数组 余数

期末周的第二把网瘾,vp了一把abc。这把打得还是比较舒服的,做出了A~E。但最后两道题还是出得太慢了(一道思路太慢,一道调试太慢)。什么时候能够在赛时做出F题呢qwq...

ABC

这场abc的ABC题还是很白给的,就不再赘述了。

D

前缀后缀和 + 二分

题意是给定一个循环数组和定值\(sum\),问是否存在一个子数组,使得总和恰为\(sum\)

这个子数组的形式只有两种情况:

  1. 原数组的某个子区间
  2. 原数组某个后缀 + 若干个整个数组 + 原数组某个前缀 拼接而成

对于情况1,采用枚举右端点,二分左端点的传统套路
对于情况2,设后缀和为\(suf\),前缀和为\(pre\) , 则有:

pre + k * S + suf == sum

其中\(S\)为整个数组的所有元素和

暴力枚举\(pre\)和\(suf\)的复杂度是\(O(n^2)\)的,考虑优化:

枚举\(suf\),由于\(pre\) \(<=\) \(S\) , 因此可以将这个式子中的\(pre\)看做余数,\(k\)看做商。则一定有 : \((sum - suf)\) % \(S\) == \(pre\) 。这样问题就转化为找一个和为\((sum - suf)\) % \(S\)的前缀。直接二分找即可,类似情况1。

两种情况的复杂度均为\(O(nlogn)\)

刚开始时看这道题就有了这个思路,但到比赛快结束时才AC。还是太菜了。。。

code

E

优先队列版bfs

思路一点都不难想,就是每次扩展时选择可以扩展的所有位置中最小的那个数就行。

因为每一次对于当前可以选择的所有数,选择了某个数时,只会扩大选择范围,而原来可以选择的那些数都仍然可以被选。而越小的数越可以选择。顺着这样的思路,很容易想到每次贪心取最小就是正解。

实现也很简单,直接队列改为小根堆再\(bfs\)就行了。

不过赛时此题WA了三发。debug了半天最后才发现是地图中的数据也会爆\(long long\),而地图的数据类型一直都是\(int\)(悲。。

code

F

数学题。赛后看完官方题解后思路逐渐清晰,最后自己补出来了。

题意就是给一个数组,求出数组中每一对 \((A_i , A_j)\) 之和并除去其中所有的因子2 的总和,注意\((A_i , A_i)\)也算一对数

由于最大值\(A_i + A_j\) \(<=\) \(2 * 10^7\) , 故除以\(2^k\)的\(k\)很小,不会超过\(26\).因此考虑找到 对于一个特定的\(k\) , 恰好含有\(k\)个因子\(2\)的所有\(A_i + A_j\) , 并设它们的总和为\(res[k]\)。

则:

 ans = Σ (res[k] / 2^k) , k = 0,1,2 …… 25

\(res[k]\)可以利用前缀和的思想来计算:

设\(sum[k]\):所有能被\(2^k\)整除的\(A_i + A_j\)的总和

则恰好含有k个因子2 的\(A_i + A_j\)的总和\(res[k]\)为 :

 res[k] = sum[k] - sum[k + 1]

现在考虑计算所有的\(sum[k]\):

暴力即直接\(O(n^2)\)找每一对数的和,并判断是否为\(2^k\)的倍数即可。优化可以利用余数的性质来优化:

  • 对于任意两个数\(x,y\),它们除以\(2^k\)的余数为\(r_x,r_y\)。若二者的和是\(2^k\)的倍数,则一定是以下两种情况之一:
    1. \(r_x,r_y\)均为0
    2. \(r_x + r_y = 2^k\)

因此可以考虑\(O(n)\)遍历数组,用\(map\)记录所有数除以\(2^k\)后得到的余数\(r\)的 个数 和 对应原数的总和 。

对于某个余数\(r\),它可以和余数为\(2^k - r\)的信息配对(相加后一定是\(2^k\)的倍数)。直接数学计算出它们产生的贡献即可,最后把所有贡献累加起来。

注意当余数为\(0\)或\(2^{k-1}\)时需要特判,因为要找的对应余数的信息就是本身。

code

G

G看官方题解是个分块,不太会qwq...那就补到这里吧。

标签:pre,suf,ABC,res,sum,384,数组,余数
From: https://www.cnblogs.com/jjjxs/p/18615959

相关文章

  • abc模块
    abc:是Python标准库中的一个模块,主要用于定义抽象基类(AbstractBaseClasses)。抽象基类提供了一种机制,允许我们在面向对象编程中定义接口,以确保子类实现特定的方法或属性。示例代码:fromabcimportABC,abstractmethodclassABCBase(ABC):@abstractmethoddefh......
  • 题解:AT_abc294_g [ABC294G] Distance Queries on a Tree
    题目链接https://www.luogu.com.cn/problem/AT_abc294_g分析先不考虑修改。设\(dist_i\)表示从根节点到第\(i\)号节点的距离,\(\operatorname{lca(u,v)}\)表示树上两点\(u,v\)的最近公共祖先,那么\(u,v\)两点间的距离就是\((dist_{\operatorname{lca(u,v)}}-dist_u)+(......
  • python毕设民宿旅馆消费数据分析系统38384程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,民宿旅馆作为一种新兴的住宿方式,以其独特的魅力和个性化的服务,逐渐受到广大旅游者的青睐。然而,随着民宿旅馆数量的不......
  • Toyota Programming Contest 2024#12(AtCoder Beginner Contest 384)D题
    D-RepeatedSequence 思路:先存储数组的前缀和,把周期的和剪掉,这样就只需要查找在一个周期是否满足,枚举1-n,毕竟不确定周期是从哪开始的,对于从当前数为起始的周期,当剩余的数res小于从当前i为起点的i后缀和时,我们只需要查找一个R 满足b[r]-b[i-1]区间和等于res,若最后查......
  • 「ABC374G」 Only One Product Name
    题意给\(n\)个长度为\(2\),互不相同,且只由大写字母组成的字符串\(s\)。你需要构造出一个字符串数组\(t\),使得对于每一个\(s_i\),存在\(t_j\)使得\(s_i\)为\(t_j\)的一个连续子串。并且对于每一个\(t_j\),它的任意一个连续长度为\(2\)的子串都在\(s\)中。求出数组......
  • 「ABC257E」 Addition and Multiplication 2
    题意最开始有一个为零的数\(x\)。你可以花费一定代价在\(x\)后面加入一个\(0\sim9\)的数字。给定你拥有的钱和加入每一个数字的代价,求能组合出的最大数。分析考虑贪心。首先,不管是什么数字,较长的数字肯定比较短的数字大。所以找出代价最小的数,先求出最大长度。然后考......
  • 「ABC305F」 Dungeon Explore
    题意一张未知的\(n\)个点,\(m\)条边的无向连通图。从\(1\)号点开始,每次交互库给出与它相连的点编号,其中选出一个往下走。在\(2n\)次交互内到达\(n\)号点。分析看到\(2n\)的次数,可以想到搜索。遍历一遍的次数是\(n\),这一轮可以把图建出来。正好剩下\(n\)次,可以......
  • 「ABC226D」 Teleportation
    题意给\(n\)组坐标\((x_i,y_i)\),你可以选择学习任意一个形式为\((a_i,b_i)\)的魔法。设当前你在\((x,y)\),对于每一个魔法\(i\),你可以使用它并到达\((x+a_i,y+b_i)\)。每个魔法都可以重复使用,求至少需要多少魔法可以让\(n\)个坐标互相到达。分析从\((x_1,y_1)\)到......
  • 「ABC245D」 Polynomial division
    题意给定多项式\(A\)和\(C\),求\(C\)除以\(A\)的结果\(B\)。分析先考虑用\(a_i\)和\(b_j\)表示\(c_{i+j}\),多项式乘法的朴素方法是把两式的每一位都乘起来,最后相加。具体形式为\[\begin{array}{c}c_{n+m}=a_{n}b_{m}\\c_{n+m-1}=a_{n}b_{m-1}+a_{n-1}b_{m}\\c......
  • 「ABC245G」 Foreign Friends
    题意一张\(n\)个点,\(m\)条边的图,每个点都有给定的颜色\(col_i\)。给定\(l\)个点作为“特殊点”,求出每个点到最近的颜色不同“特殊点”的距离。分析学校里定时训练的abc套题,赛时直接跳了。赛后看,结果是一个套路题。枚举的二进制位,类似旅行者,然后比对\(col_i\)二......