首页 > 其他分享 >ABC338G题解

ABC338G题解

时间:2024-02-09 09:02:58浏览次数:40  
标签:lways limits 题解 矩阵 ABC338G 加号 表达式 mat

也许是一个简单一点的做法?

假如我们要求一个表达式的值,我们求的顺序显然是,按照加号划分为若干段,段内只有数字和乘号,计算出段内结果后全部加起来。

称一个只有数字和乘号的表达式是基本表达式,我们将每个表达式的贡献拆分为若干个基本表达式之和,那么我们就可以枚举每个基本表达式,算它在多少个表达式里出现过,它在最终答案里的贡献也就算出来了。

假设我们现在要计算基本表达式 \([i,j]\) 的贡献,\([i,j]\) 的意思是题目给出的原串的的 \([i,j]\) 这一段子串。

首先考虑如何计算它在多少个表达式里出现过,注意到若 \(i\) 左侧不是加号,那么左侧的选择已经唯一了,否则就是 \([1,i]\) 中数字的个数,另一侧同理。

接下来考虑如何计算它的值,假设我们有一个二元组 \((Q,Q*x)\) ,\(Q\) 表示上一个乘号之前的积, \(Q*x\) 表示当前表达式的值,\(x\) 是当前的数字,那么我们从左往右扫描该基本表达式。

碰到数字 \(d\) ,那么 \((Q,Q*x)->(Q,Q*(10x+d))->(Q,10*Q*x+d*Q)\),碰到乘号,那么 \((Q,Q*x)->(Q*x,0)\) ,然后你发现这两个变换都可以写成矩阵乘法的形式。

所以 \(Ans=\sum\limits_{i,j} lways(i)*rways(j)*(\prod\limits_{k=i}^jmat[k])_{0,1}\)

\(lways\) 表示可选左端点个数, \(rways\) 同理,这个上面已经分析过了, \(mat\) 是矩阵, \(0,1\) 是矩阵积的 \(0\) 行 \(1\) 列的值,原因是二元组初始为 \((1,0)\) 手动矩阵乘法即可得。

那么我们从左往右扫描 \(j\) ,\(j\) 已知,假设我们已经维护出 \(\sum\limits_{i} lways(i)*\prod\limits_{k=i}^j mat[k]\) ,那么对答案的贡献好算,提取对应位置后乘上 \(rways(j)\) 即可,怎么 \(j->j+1\) 呢,你发现只要右乘 \(mat[j+1]\) 之后加上 \(lways(j+1)*mat[j+1]\) 即可。

进一步的,你发现矩阵只需要保留第 \(0\) 行的两个位置就好了,含义就是,所有以 \(j\) 为右端点的基本表达式的 \(Q*lways(i)\) 之和, \(Q*x*lways(i)\) 之和。

碰到加号的时候 \((Q,Q*x)->(0,0)\) ,原因是基本表达式不含加号。

代码:Submission #50104472 - AtCoder Beginner Contest 338

代码很短,很好写,要维护的东西很少,很简洁。

标签:lways,limits,题解,矩阵,ABC338G,加号,表达式,mat
From: https://www.cnblogs.com/llzer/p/18012303

相关文章

  • CF516D Drazil and Morning Exercise 题解
    Description给定一棵\(n\)个点的树,边有边权。定义\(f_x=\max_{i=1}^n\text{dist}(x,i)\)。\(q\)次询问最大的满足\(\max_{x\ins}f_x-\min_{x\ins}f_x\lel\)的连通块\(s\)包含的点数。\(n\le10^5\),\(q\le50\)。Solution这里\(f_u\)显然可以用换......
  • CF1771F Hossam and Range Minimum Query 题解
    题目链接:CF或者洛谷比较不错的题,出现奇数次出现的这种问题,比较容易想到一种运算,那就是异或和运算。如果一个区间上一个数出现偶数次,则它对于异或和的贡献为\(0\),那么很显然,我们维护下区间异或和即可判断一个区间上是否存在出现奇数次的数。然后我们注意到\(1\oplus2\oplu......
  • CF1861E Non-Intersecting Subpermutations 题解
    简要题意一个长度为\(n\)的元素在\([1,k]\)的整数序列\(a\)的价值定义如下。初始\(i=1\),如果\(a_{i\simi+k-1}\)包含了\(1\simk\)的所有整数,则价值加\(1\),然后令\(i=i+k\)。如果没有包含\(1\simk\)的所有整数则\(i=i+1\),直到\(i\geqn-k+2\)时结束。......
  • CF1863F Divide, XOR, and Conquer 题解
    简要题意你有两个指针\(l,r\)初始时\(l=1,r=n\)。你可以操作若干次知道\(l=r\)。每次操作你可以选择一个整数\(k\in[l,r)\),记\(x=\bigoplus_{i=l}^ka_i,y=\bigoplus_{i=k+1}^ra_i\)。如果\(x\leqy\),你可以令\(l=k+1\)。如果\(x\geqy\),你可以令\(r=k\)。......
  • P9663 Permutation on Tree 题解
    考虑枚举一个\(x\in[1,n)\),将\(\leqx\)的看作\(0\),\(>x\)的看作\(1\),那么一个排列的贡献实际上就是\(\sum_{x=1}^{n-1}\sum[[p_i\leqx]+[p_{i+1}>x]=1]\)。那么问题转变为一个给定一棵树,每一个点有权值\(0\)或\(1\),求所有排布方案的贡献之和。设\(f_x\)表示......
  • P9697 Canvas 题解
    首先观察到有一个关键性质是\(1\leqx_i,y_i\leq2\)。那么我们贪心的考虑我们肯定会将\((x,y)=(1,1)\)的在一开始操作,\((x,y)=(2,2)\)的最后操作。也就是说现在没有固定的是\((x,y)=(1,2)\)和\((x,y)=(2,1)\)的。我们不妨令\((x,y)=(1,2)\),然后连边\((l,r)\)。然......
  • P10013 Tree Topological Order Counting 题解
    首先题目里面写了每一个数都有权值,一般这种题只能去想求出每一个的具体方案数,那么也就是我们得求出\(h_{i,j}\)表示在所有合法拓扑序中\(a_i=j\)的方案数。一颗树的拓扑序数量是\(\dfrac{n!}{\prodsiz_i}\),相信大家都知道。因为我们需要保证这一棵树满足拓扑排序的条件,不......
  • P10068 [CCO2023] Line Town 题解
    好题,但是感觉写起来有点屎。题目大意给定一个序列\(a\),你每次可以选择\(i\in[1,n-1]\),交换\(a_i,a_{i+1}\),并且给\(a_i,a_{i+1}\)取相反数。问你最少需要多少次交换才能使得序列非降,可能无解。做法首先考虑给偶数位置初始乘上\(-1\),然后操作变成交换相邻两个数,下面提......
  • CF1706E 题解
    你谷题目传送门CF题目传送门题目大意给定一个\(n\)个点\(m\)条边的无向图,询问\(q\)次,每次询问会指定两个正整数\(l,r\),问要使对于\(l\leqa\leqb\leqr\)的所有\(a,b\)均有路径可以互相到达,最少需要加入前多少条边。思路考虑到每一次询问实质上就是问你在按......
  • [COCI2007-2008#1] ZAPIS 题解
    题目传送门前置知识区间型动态规划思考过程这题也算是一道很经典的问题了(?)。看见\(n\leq200\),不难想到复杂度为\(O(n^3)\)的区间型动态规划。题面中有这么一段话。空串是规则括号序列。如果\(\textttA\)是规则括号序列,那么\(\texttt{(A)[A]{A}}\)都是规则括号......