首页 > 其他分享 >【题解】AtCoder abc322_f Random Update Query

【题解】AtCoder abc322_f Random Update Query

时间:2023-12-11 10:56:46浏览次数:25  
标签:AtCoder 位置 题解 Random 矩阵 ans hvp 操作 array

传送门:https://atcoder.jp/contests/abc332/tasks/abc332_f

容易发现,对于一个位置 $i$,$A_i$ 的最终值是由对 $i$ 的最后一次赋值操作决定的;因此,将所有操作按时间顺序倒过来考虑,则由第 $j$ 次操作决定 $A_i$ 最终值的概率为"在第 $(j+1)$~$m$ 次操作中没有修改过 $i$ 的概率"与"第 $j$ 次操作修改 $i$ 的概率"乘积;
此处提供两种思路:
第一种:
基础思路:按照倒转后的操作顺序,每次统计一个操作对于所有 $i$ 答案的贡献;
记第 $i$ 个位置截至目前仍未被修改的概率为 $hvp_i$、该位置答案为 $ans_i$;设第 $j$ 次操作为随机将 $[l,r]$ 中任意一个位置的值修改为 $x$,则对于所有 $i\in[l,r]$,我们要令 $ans_i=ans_i+hvp_i*\frac{1}{r-l+1}*x,hvp_i=hvp_i*\frac{r-l}{r-l+1}$(二者同时进行,没有先后顺序);
此时,对于这样“每个位置有多个参数,每次要在连续一段位置的每个参数组自身内部做变换”的问题,我们可以联想到线段树维护矩阵乘法,每次操作就相当于给一段连续位置乘上同一个矩阵;(注:此处推荐另一道非常相似但是强于本题的题目:https://www.luogu.com.cn/problem/P7453)
刚才我们的操作,可以转换为: $\left| \begin{array}{cccc} hvp_i & ans_i \end{array} \right| $ $*=$ $\left| \begin{array}{cccc}     \frac{r-l}{r-l+1} & \frac{1}{r-l+1}*x \\    1 & 0 \end{array} \right| $
此时我们就有了做法:维护一棵 $n$ 个点的线段树,线段树的每个节点上是一个矩阵,位置 $i$ 的初始值为 $\left| \begin{array}{cccc}     hvp_i & ans_i \end{array} \right| $;将所有操作的顺序倒过来,每次对于操作范围 $[l,r]$,在线段树上给 $[l,r]$ 区间内每个矩阵都乘上一个$\left| \begin{array}{cccc}     \frac{r-l}{r-l+1} & \frac{1}{r-l+1}*x \\    1 & 0 \end{array} \right| $ 即可。所有操作结束后,剩余的 $hvp_i$ 值就代表了“$i$ 从未被修改过,$A_i$ 从未改变的概率”,所以要记得给 $ans_i$ 在最后加上 $hvp_i*A_i$。
时间复杂度 $O(m$ $log n)$。
第二种:
基础思路:每次统计单个位置的答案;
仍然沿用第一种做法中将问题转化为矩阵乘法的想法,只是转化为每次统计单个位置答案;仍然倒转操作顺序,考虑对于一个 $i$,所有的操作 $j$ 分为两种:要么 $i\in[l_j,r_j]$,这种情况下 $i$ 对应的矩阵要乘上 $j$ 对应的矩阵;要么 $i\notin[l_j,r_j]$,这种情况下 $j$ 不对 $i$ 的矩阵产生影响;
由于每次的操作都在一个区间上进行,因此我们考虑差分;从左往右依次计算每个位置的答案,在左端点 $l_j$ 添加 $j$ 对当前位置答案的影响,在右端点 $r_j$ 时撤销这个影响,这样我们就能在 $O(n)$ 次影响的添加和撤销内,动态维护当前位置受到的所有影响。
具体实现上,可以仍然维护线段树,只是点数变成了 $m$ 个。添加操作 $j$ 对当前位置的影响时,我们将点 $j$ 上的矩阵修改为它的对应矩阵,撤销影响时则将其修改为单位矩阵;因为矩阵乘法没有交换律,所以在线段树的 $push_up$ 操作时要保证是左边的结果*右边的结果。
时间复杂度 $O(m$ $log m)$。
由于本题 $n、m$ 同级别,所以两种做法复杂度没有优劣区别,程序也大体相似,觉得哪个更自然就选择哪个即可。

标签:AtCoder,位置,题解,Random,矩阵,ans,hvp,操作,array
From: https://www.cnblogs.com/hellstairs/p/17893869.html

相关文章

  • AtCoder Regular Contest 169 (ARC169)
    怎么有人ARCA卡了半天的?A.PleaseSign考虑\(i\)位置上的数,下次它被加到\(P_i\),再下次被加到\(P_{P_i}\),因为这个序列有性质\(P_i<i\),这样加若干轮一定会到达\(1\)。令所有的\(i\)向\(P_i\)连边,则这是一棵以\(1\)为根的树。设\(f_i=\sum\limits_{j=1}^n[dep_......
  • AtCoder_abc332
    AtCoder_abc332比赛链接A-OnlineShoppingA题链接题目大意这里有\(N\)件商品,第\(i\)件商品价格为\(P_i\),你要购买\(Q_i\)件,除了购买的费用外,他还要支付运费。如果购买的总价大于\(S\),运费为0元,否则他需要支付\(K\)元的运费。他一共要花多少钱呢?解题思路无代码//Prob......
  • 【题解】AtCoder abc332_g Not Too Many Balls
    传送门:https://atcoder.jp/contests/abc332/tasks/abc332_g看完题,第一眼反应为最大流。建模方式为:以颜色为左部点,盒子为右部点,源点$S$向颜色$i$连一条容量为$A_i$的边,盒子$j$向汇点$T$连一条容量为$B_j$的边,颜色$i$向盒子$j$连一条容量为$ij$的边;在这张图......
  • AtCoder Beginner Contest 332
    AtCoderBeginnerContest332A-OnlineShoppingintmain(){IOS;for(_=1;_;--_){cin>>n>>m>>k;llans=0;rep(i,1,n){lla,b;cin>>a>>b;ans+=a......
  • Atcoder abc301 复盘(更新中)
    跳转比赛链接A-OverallWinner简述:高桥和青木下了\(N\)盘棋。给你一个长度为\(N\)的字符串\(S\),表示这两盘棋的结果。如果\(S\)的\(i\)个字符是t,那么高桥赢得了\(i\)局;如果\(S\)的\(i\)个字符是A,那么青木赢得了这局。高桥和青木之间的胜负关系是谁赢的局......
  • AtCoder Beginner Contest 331 G - Collect Them All【概率期望+容斥+多项式】
    题目链接:ABC331_G写在前面将来如果回顾这道题,建议自己看完题意一定先重新推一遍。如果还是不够熟练,多去做一些同类型的题目吧。题意:盒子里有\(N\)张卡片,每张卡片上写着一个数字,数字的范围是\(1,...,M\),写着数字\(i\)的卡片有\(C_i\)张\((C_i>0)\)。有放回地抽取卡片,每......
  • AT_cf17_final_j Tree MST 题解
    题意:给定一颗\(n\)个点的树,点\(i\)有权值\(a_{i}\),边有边权。现在有另外一个完全图,两点之间的边权为树上两点之间的距离加上树上两点的点权,求这张完全图的最小生成树。首先有一个很显然的暴力,把完全图中每两点之间的边权算出来,然后跑一边最小生成树,时间复杂度\(O(n^{2}\lo......
  • P7735 [NOI2021] 轻重边 题解
    是一道树剖好题,之前听lsl讲过一点,于是很快就做出来了。题意:有一个\(n\)个节点的树,最开始的时候所有边都是轻边,维护两个操作:操作一:将\(u\)到\(v\)的路径中经过的所有点的邻边变为轻边,再将这条路径上的边变为重边。操作二:求出\(u\)到\(v\)这条路径上有多少条重边......
  • 小程序建立用户与数据的联系问题解决方案
    在小程序中建立用户与数据的联系是一个常见的问题,在本文中提供了一个解决方案。这个解决方案包括几个关键步骤。首先,需要通过用户登录功能实现用户的身份识别,并获取到用户的唯一标识符。接着,需要在后台数据库中创建一个用户表,用于存储用户的基本信息和与之相关联的数据。在这个表中......
  • ARC169 B Subsegments with Small Sums 题解
    LinkARC169BSubsegmentswithSmallSumsQuestion\(x\)是一个序列,定义\(f(x)\)为把序列\(x\)切成几段,每段的和不能超过\(S\)的最小段数给出序列\(A=(A_1,A_2,\cdots,A_N)\)求:\[\sum_{1\lel\leN}f((A_l,A_{l+1},\cdots,A_r))\]Question先考虑一个结论,\(x\)为......