首页 > 其他分享 >[ARC159F] Good Division 题解

[ARC159F] Good Division 题解

时间:2023-11-02 12:11:46浏览次数:33  
标签:Division 题解 sum 绝对 mid ARC159F 众数 mathcal dp

[ARC159F] Good Division 题解

首先对于题目要求的划分方式转化一下,转化为划分的每一段都没有 绝对众数,可以证明这与题目中的要求是完全等价的,证明如下:

充分性:考虑构造一种操作方法,就是每次操作都消去一个出现次数最多的数,按照这样操作可以保证每次操作之后该区间仍然不会出现绝对众数,故按此方法可以清空整个区间。

必要性:考虑该区间有绝对众数,容易发现无论如何操作最终仍旧会剩下若干相同的数,剩下的数为最开始的绝对众数(证明方法类似于摩尔投票)。

有了这一步转化之后考虑如何去做。首先可以暴力 DP,设 \(dp_i\) 表示对前 \(i\) 个数进行划分,并且以 \(i\) 为右端点划分最后一段的方案数,那么有转移:

\[dp_i=\sum_{[j+1,i]无绝对众数} dp_j \]

复杂度 \(\mathcal{O}(n^2)\)。考虑如何优化:

有一个比较经典的结论:

对于一个序列 \(\{a_n\}\),该序列的所有前缀中出现过的绝对众数的种类数为 \(\mathcal{O}(\log n)\)。

证明可以感性理解一下:当我们从序列一段往另一端遍历的过程中依次加入元素,如果能够出现一个 新的 绝对众数 \(x\) 说明 \(x\) 的出现次数已经超过了之前的绝对众数 \(y\) 的出现次数,那么说明出现 新的 绝对众数 \(x\) 时序列长度至少乘 \(2\),所以说绝对众数种类数为 \(\mathcal{O}(\log n)\)。

那么比较显然我们可以尝试从绝对众数种类数方面去优化 DP。我最初的想法是将 DP 转移写成如下形式:

\[dp_i=\sum_{j=0}^{i-1}dp_j-\sum_{x=1}^{2n}\sum_{[j+1,i]的绝对众数为 x} dp_j \]

这样第一维转移只用枚举 \(\mathcal{O}(log_n)\) 次。但是第二维仍旧不好判断 \(x\) 是否是其区间众数。

但第二维转移跟序列上的区间有关,所以可以尝试 cdq 分治!

每一次我们计算 \(dp_{l-1\sim mid-1}\) 对于 \(dp_{mid+1\sim r}\) 的贡献,也就是说在这一层我们统计所有 \(i\) 所在段跨过 \(mid\) 的转移。而所有跨过 \(mid\) 的区间的绝对众数种类数仍旧是 \(\mathcal{O}(\log n)\) 种,证明类似,所以说分治之后就可以枚举绝对众数 \(x\) 然后将所有 \(a_i=x\) 的地方设为 \(1\),其余地方设成 \(-1\),然后暴力做一遍前缀和,统计即可,具体的,若设 \(sum_i\) 为 \(i\) 的前缀和,则有转移:

\[dp_i=\sum_{j\in[l-1,mid-1]}dp_j-\sum_{j\in[l-1,mid-1]\and sum_i>sum_j}dp_j \]

可以树状数组维护,复杂度 \(\mathcal{O}(n\log^3 n)\)。但其实树状数组可以省掉,因为发现 \(sum_i\) 的范围是 \(\mathcal{O}(r-l+1)\),所以说可以先预处理出来 \(pre_i\) 表示:

\[pre_i=\sum_{j\in[l-1,mid-1]\and sum_j\le i}dp_j \]

这一步是 \(\mathcal{O}(r-l+1)\) 的,所以最终复杂度为 \(\mathcal{O}(n\log^2 n)\)。代码如下

标签:Division,题解,sum,绝对,mid,ARC159F,众数,mathcal,dp
From: https://www.cnblogs.com/zyc070419-blog/p/17805106.html

相关文章

  • 10.30 CF1685 题解
    10.30CF1685A.CircularLocalMiniMax题意给你\(n\)个整数$a_1,a_2,\ldots,a_n$。问有没有可能将它们排列在一个圆上,使每个数字严格地大于其相邻的两个数字或严格地小于其相邻的两个数字?题解直接排序然后按照\(1,4,2,5,3,6\)的规律放,check一下合不合法就行了。......
  • 题解:[SCOI2008] 城堡
    应该是联赛前最后一次任性了,浪费的时间有点多,不过也揭露了我的基础知识和代码能力都很弱的问题,得加油啊。先stodwt。给定一棵基环树森林,起初有\(m\)个点已被选进\(S\)里,你需要再选\(k\)个点加入到\(S\)中,最小化其余点到\(S\)距离的最大值。这个问题直接做非常困难,......
  • Luogu P3862 数圈 题解
    看数据范围——题记传送门考虑记\(f_i\)表示有\(i\)个点的完全图的圈数\(g_i\)表示有\(i\)个点的完全图中一个点到另一个点不同路径的方案数\(ans\)表示答案容易知道递推式\[f_i=g_{i-1}\timesC_{i-1}^2+f_{i-1}\]\[g_i=g_{i-1}\times(i-2)+1\]\[ans=f_{n-......
  • Sasha and Array 题解
    SashaandArray题目大意给定一个长为\(n\)的序列\(a\),支持以下操作:\(\foralli\in[l,r],a_i\getsa_i+x\)。求\(\left(\sum\limits_{i=l}^{r}F_{a_i}\right)\bmod(10^9+7)\),其中\(F\)表示斐波那契数列,即有\(F_1=1,F_2=1,\foralli>2,F_i=F_{i-1}+F_{i-2}\)。......
  • 第四届辽宁省大学生程序设计竞赛部分题解
    2023辽宁省赛A:欢迎来到辽宁省赛题目描述小Z躺在床上看了看表,现在是13:30,2023辽宁省大学生程序设计竞赛的报名将会在14:00截止。然而不急,省赛的参赛队伍还没有向他提交名单。小Z知道,只要3分钟他就可以完成报名,完成汇款。现在他想知道,队伍要在多少分钟内......
  • [ABC326D] ABC Puzzle 题解
    题意:给定整数\(N\),字符串\(R,C\),构造满足以下条件的\(N\timesN\)矩阵:1.每一行和每一列中\(A,B,C\)各有且仅有一个。2.第\(i\)行的第一个字母等于字符串\(R\)的第\(i\)个字符。3.第\(i\)列的第一个字母等于字符串\(C\)的第\(i\)个字符。看数据范围考虑应该......
  • P4067 [SDOI2016] 储能表 题解
    [SDOI2016]储能表-洛谷题目详情-[SDOI2016]储能表-BZOJbyHydroOJ一道很好的数位dp题不过这题有一个比较有意思的性质:当\(n,m\)为\(2^k\)的形式时,最终得到的数组对每一行排序后为\(0\simm-1\)的排列,如果有的话说不定可以作为一个部分分?遇到二进制运......
  • 11月3号晚上测试题解
    3954ProblemA变量交换输出#include<stdio.h>intmain(){inta,b,c,x;scanf("%d%d%d",&a,&b,&c);//假设a,b,c分别为1,2,3;选择一个中间值进行数值替换x=a;//把a赋值给x,此时x就等于a的值为1a=c;//把c赋值给a,此时a就等于c的值为3c=b;//把b赋......
  • CF1874F Jellyfish and OEIS 题解
    题目链接不明白出题人的脑回路是不是被宇宙射线改变过/jy。题目给出了若干个区间,要我们计算满足每个区间都不是对应下标的排列的数量,正着计算不满足要求的数量是困难的,我们将其容斥,转化为钦定一些区间要求其必须满足它是对应下标的排列,在下文中,我们称这样的区间为一个约束。我......
  • 题解 P6560 [SBCOI2020] 时光的流逝
    题解P6560[SBCOI2020]时光的流逝首先考虑图上的点为\(y\)终点时,或者这个点无法继续向下走,即\(du_i=0\)时,从这个点为起点先手必败,而对于每一个有一条指向先手必败的点的边的点,显然从这个点出发都是先手必胜的,以此类推。可以考虑建反图,进行拓扑排序,转移状态。#include<q......