普通、带修(可持久化)莫队算法入门例题详解

目录

【莫队算法】

【普通莫队】

【代码】

【题面】

【带修莫队】

【代码】

【题面】

【总结】


 

【莫队算法】

参考大米饼的莫队算法 ,目前的题型概括为三种:普通莫队,带修莫队以及树形莫队。

【普通莫队】

例题:2038: [2009国家集训队]小Z的袜子(hose)

题意:给定编号1-n的n只袜子的颜色,输出从询问的区间[L,R]中随机抽出两只袜子颜色相同的概率。

首先考虑对于一个长度为n区间内的答案如何求解。

题目要求Ans使用最简分数表示:那么分母就是n*(n-1)->表示两两袜子之间的随机组合,分子是每种颜色可能配对情况的累加和,即该区间内每种颜色i出现次数sum[i]*(sum[i]-1)。

莫队算法的思路是,离线情况下对所有的询问进行一个美妙的SORT(),然后两个指针l,r(本题是两个,其他的题可能会更多)不断以看似暴力的方式在区间内跳来跳去,最终输出答案。

掌握一个思想基础:两个询问之间的状态跳转。

当前完成的询问的区间为[a,b],下一个询问的区间为[p,q],现在保存[a,b]区间内的每个颜色出现次数的sum[]数组已经准备好,[a,b]区间询问的答案Ans1已经准备好,怎样用这些条件求出[p,q]区间询问的Ans2?

普通、带修(可持久化)莫队算法入门例题详解_第1张图片

考虑指针向左或向右移动一个单位,我们要付出多大的代价才能维护sum[]和Ans(即使得sum[],Ans保存的是当前[l,r]的正确信息)。

我们对图中a,b的向右移动一格进行分析: 

a指针向右移动一个单位,所造成的后果就是:我们损失了一个i颜色的方块,那么我们要怎样维护呢?sum[i]-1即可。那Ans如何维护呢?分母从n*(n-1)

你可能感兴趣的:(板子,普通莫队)