随笔分类 - 数据结构
摘要:题目链接 题解 可以发现,对于区间$[l,r]$,只有整块中的众数与不被整块包含的数有成为该区间众数的可能(共$2\cdot 块长+1$个)。因此预处理出$f[i][j]\(表示块编号\)[i,j]$区间内的众数,具体实现:将$a$数组离散化,设$tmp$数组存储每个数出现的次数,枚举$i,j$,用
阅读全文
摘要:题目链接 题解 因为提供的描述仅为动物间的关系,而无法确定动物的种类。可以开一个原数组3倍的并查集,分别表示A,B,C3类,每类中都有全部$n$个动物。例如A类中的动物$x$表示$x$为A类动物的信息,将可以相互推理得出的信息用并查集链接。对于同类的描述,如果$x,y$之间存在捕食关系,也就是$x$
阅读全文
摘要:题目链接 题解 动态查询区间k小值——树状数组套主席树( •̀ ω •́ ) 如果直接主席树上进行动态修改,每次需要修改$[l,r]$区间内所有的根,时间复杂度为$O(nlogn)$。主席树是前缀和,树状数组也是前缀和,而且还可以动态修改,巧了你们两个认识一下( 具体实现:主席树中以$rt_i$为根
阅读全文
摘要:题目链接 题解 可以发现,只有两相邻元素之间的差会对答案做出贡献。简单证明:设$i<k<j,a_i<a_j$,若$a_k>a_j>a_i$, 易得$a_k-a_i>a_j-a_i,k-i+1<j-i+1$,所以$\frac{a_k-a_i+a_k-a_j}{k-i+1}>\frac{j-i+1}$,
阅读全文
摘要:题目链接 题解 ⭐:①可以将整除的条件转化为余数为$0$。②枚举左右端点可以找寻单调性,尝试固定一端二分另一端。 暴力的话枚举左右端点,然后$O(n)$求乘积余数,总时间复杂度为$O(n^3)\(。其中区间乘积求余可以使用线段树维护,又可发现,若区间\)[i,j]$的乘积可以被$k$整除,则对于$j
阅读全文
摘要:题目链接 题解 ⭐:单调栈可以维护$[1,i]$中大于或小于$a_i$的元素。 由于数据范围枚举左右端点并不现实,因此想到求出每个元素对于答案的贡献。设$[1,i)\(中最后一个\)>a_i$的数为$l$,$(i,n]\(中第一个\)>a_i$的数为$r$,$(r,l)$即为$a_i$作为最大值的最
阅读全文
摘要:题目链接 题解 容易发现,$s_i,t_i$对于$a_+1$的操作影响并不大,因为$t_i<a_$无论如何都会触发该操作。而对于$s_j=s_i,t_j=t_i,j<i$的三元组$s_j,t_j,u_j$只需将$a_-1$即可。我们需要在$logn$的时间内进行上述$+1,-1$的操作,并查询最终$
阅读全文
摘要:题目链接 题解 将密文$t$反转后,此题便化为一般的字符串匹配。 因为存在对之后状态产生影响的不同方案,可以想到dp:$dp_i$表示字符串$t$(反转后)前$i$项可以匹配的最后一个单词下标(若无法匹配为$0$)。设单词$j$长度为$a$,如果$dp[i]>0$并且存在单词与$t$串$[i+1,i
阅读全文
摘要:题目链接 题解 容易看出此题为dp问题,利用LIS的思想可设计出如下$O(n^2k)$的算法。 状态:$dp[i][j]$表示以$a_i$为结尾、长度为$j$的上升子序列个数。 初始值:\(dp[i][1]=1,dp[0][j]=0\quad(1\le i\le n,1\le j\le k)\)。
阅读全文
摘要:题目链接 题解 从$n,m\le 3\cdot 10^5$可看出,此题需在$logn$的时间内进行区间修改与单点查询。而描述操作位置的只有距离(子树深度)一个变量,可以想到以深度为关键字建立线段树或树状数组。 设点$i$深度为$pos_i$,对于每个操作将深度区间$[pos_,pos_+d_i]+x
阅读全文
摘要:题目链接 题解 下文将符合题意的数对成为“逆数对”。 可以发现,$x=a_i$的逆数对个数为满足$i<j\le a_i,a_j\ge i$的$j$个数,因为$j$的季数需$\le i$的最大集数,而其最大集数需$\ge i$的季数。对于第一个条件,可以将$j$存入树状数组,每次取区间$[i+1,a_
阅读全文
摘要:题目链接 题解 $n$的数字范围很小,又加之01串的条件,容易想到状压。01串的个数很少,一共只有$2^{12}=4096$个,而其余都是重复的,并且$w,k\le 100$,可以想到将每个字符串在不同$k$时的答案预处理。具体方法受Trie树的启发,想到将集合$S$中的01串以二叉树存储,如题目中
阅读全文
摘要:题目链接 题解 可以想到,这道题需要维护每日的内核数,并利用贪心思想找出该日价值从小到大的前$k$个内核。第一想法是优先队列+二分,但无法处理出队,于是卡住了(# -_ゝ-)。此后阅读了一篇题解,发现可以使用权值线段树。 线段树中维护当日每个价值的内核个数(因为$p_i\le 10^6$,不需要离散
阅读全文
摘要:CF1142B Solution 题目翻译 题解 这道题的数据范围是$2e5$,所以算法的时间复杂度需要在$O(nlogn)$以内,又因为$q\le 2e5$,所以要么可以在$O(logn)$的复杂度内查询,要么是静态算法。经思考前者不太可行,因此这道题是$O(nlogn)$以内的静态算法,可以想到
阅读全文
摘要:题目链接 题解 什么时候可以执行操作:若想将$a_i$取出到$b$数组中,则$a_$与$a_{i+1}$中一定有一项没有出现在$b$数组接下来的元素中,因为要将其删除。 如何统计答案:假设$a_i=b_j$,对于每一个$b_j$有两种可能方案,删除$a_$或$a_{i+1}$。易证,在两种方案都可执
阅读全文