集训杂题整理

集训杂题整理:

蒲公英

求区间众数。

像这种不好合并的数据我们可以考虑分块处理。先离散化,再分块维护离散化后的值。此时,如果查询的区间左右端点所属的块相邻或相间,可以直接暴力查询。那如果两个块之间隔了多个块呢?按照分块的一般思路我们可以对散块进行暴力查询,对于整块考虑预处理。用 \(pre_{i,j}\) 表示第 \(i\) 到第\(j\)个块的最小众数,\(s_{i,j}\)表示前\(i\)个块内\(j\)的出现次数。\(s,pre\) 都可以在\(O(n\sqrt{n})\) 的复杂度内处理。

这样的话对于两个块距离较大的数据,我们所求的答案就是所有整块的答案并上散块的答案,整块的答案可以通过\(p\)求出,散块的借助\(s\)快速求出。时间复杂度\(O(n\sqrt{n})\)

\(code\)

DZY Loves Fibonacci Numbers

这题的主要难点在于区间加这个操作。考虑斐波那契数列的通项公式:

\[f_n=\frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n) \]

这样我们只需用两棵线段树分别维护两个等比数列,套用等比数列求和公式,最后查询时将两棵树上的结果相减即可。

\(code\)

Permutation

先考虑转化一下题意,本题要求一个数组是否存在三个数\(x,y,z\),使\(a_x,a_y,a_z\)满足\(a_y-a_x=a_z-a_y\),此时这个答案还是不好直接得到,所以我们可以想到转化要求的东西。先定中间的\(y\),在考虑两边的\(x,y\),看是否存在\(x,y\)使\(\frac{a_x+a_z}{2}=a_y\),这样还是不能在规定时间内求出答案,所以还要再转换一下思路。考虑维护一个数组\(c_i\),表示这个数在之前是否出现过,若出现过则为\(1\),没有出现过则为\(0\)。这样不存在一个等差数列的充要条件即为存在一个以当前枚举的\(a_i\)为中心的回文串。判断回文串可以比较两边的哈希值,哈希值则由线段树进行维护,时间复杂度\(O(nlogn)\)

code

Short Colorful Strip

\(f_{i,j}\) 为区间\([i,j]\) 的答案,我们观察一下题目,可以发现对于一个连续的颜色段,他只会发生分裂,即分裂成两个连续段,而不会与相邻连续段合并。这样的话我们就可以考虑对于一个区间找出其中颜色最小的一点,编号记为\(pos\),然后考虑\(f_{i,k},f_{k+1,pos-1},f_{pos+1,k'},f_{k'+1,j}\)四个区间的答案进行更新即可,这样的复杂度是\(O(n^4)\)的。

考虑对这个做法进行优化,我们发现\(pos\)左右两边对答案的贡献是互不影响的,所以可以分别枚举\(pos\)两边,将两边得到的方案数乘起来进行更新,时间复杂度\(O(n^3)\)

\(code\)

Miss Punyverse

神题orz,当时lxr上课讲的时候没完全听懂,后来看了一下题解才彻底搞懂。

考虑用\(f_{i,j}\)表示在\(i\)的子树内划分出\(j\)个连通块后最多有多少个连通块满足条件,为了方便转移我们可以开一个结构体让\(f_{i,j}\)同时记录子树内 \(w_i-b_i\) 的最大值,这里我们可以发现当最大符合条件的连通块数目相同时,\(w_i-b_i\) 越大对后续情况来讲是越优的。因此在转移时若需要进行比较,则只要以最大连通块数目为第一关键字,\(w_i-b_i\) 为第二关键字比较即可。转移的话则类似于树形背包。

推一下可以得到方程式为(下面的\(num\)表示连通块数量,\(s\)表示值):

\[t_{num}=f_{{x,j}_{num}}+f_{{y,k}_{num}}+(f_{{y,k}_{s}}>0) \]

\[t_s=f_{{y,k}_{s}} \]

\[f_{x,j+k}=max{(f_{x,j+k},t)} \]

以上是第一种情况,即将\(x\)算作一个独立的连通块。
而如果将\(x\)并到子树所在的连通块那么:

\[t_{num}=f_{{x,j}_{num}}+f_{{y,k}_{num}} \]

\[t_s=f_{{x,j}_{s}}+f_{{y,k}_{s}} \]

\[f_{x,j+k-1}=max{(f_{x,j+k-1},t)} \]

\(code\)

CF797F

首先考虑暴力\(\text{dp}\) ,用\(f_{i,j}\) 表示前\(j\)个老鼠进入前\(i\)个洞所需要的最短距离,\(s_{i,j}\)表示前\(j\)个老鼠进到第\(i\)个洞的距离。然后就可以快速推出转移方程式,即:

\(f_{i,j}=\min({f_{i-1,k}+s_{i,j}-s_{i,k}})\)

显然这个dp是无法通过此题的,然后我们就要考虑优化。注意到\(s_{i,j}\) 是一个定值,我们可以用单调队列在转移的时候同时维护\(s_{i,j}\),时间复杂度\(O(nm)\)

\(code\)

posted @ 2023-09-08 09:47  OIer_xxx2022  阅读(26)  评论(0)    收藏  举报