2017 Multi-University Training Contest 1 solutions BY 北京航空航天大学

1001. Add More Zero

答案就是  ⌊log10(2m−1)⌋\left \lfloor \log_{10}(2^m - 1) \right \rfloorlog10(2m1),注意到不存在  10k=2m10^k = 2^m10k=2m ,所以 ⌊log10(2m−1)⌋=⌊log102m⌋=⌊mlog102⌋\left \lfloor \log_{10}(2^m - 1) \right \rfloor = \left \lfloor \log_{10}{2^m} \right \rfloor = \left \lfloor m \log_{10}{2} \right \rfloorlog10(2m1)=log102m=mlog102,这样做的时间复杂度是 O(1) 。

1002. Balala Power!

每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大。最大的数匹配 25,次大的数匹配 24,依次类推。排序后这样依次贪心即可,唯一注意的是不能出现前导 0。

1003. Colorful Tree

单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和。反过来思考只需要求有多少条路径没有经过这种颜色即可。直接做可以采用虚树的思想(不用真正建出来),对每种颜色的点按照 dfs 序列排个序,就能求出这些点把原来的树划分成的块的大小。这个过程实际上可以直接一次 dfs 求出。

1004. Division Game

显然每个石子堆最多做  ∑i=1mei\sum_{i = 1}^{m}{e_i}i=1mei (记为  www )次操作。此外,如果定义一个堆做  xxx 次操作恰好变为  111的方案数为  f(x)f(x)f(x) ,显然每个数字做少于  xxx 次操作不变为  111 的方案数也是  f(x)f(x)f(x) 。

为了统计结束于石子堆 iii 的情况数,我们可以枚举这是它第几次操作时结束的,不妨设为 xxx ,则对应的方案数恰好是 f(x+1)i−1f(x)k−i+1f(x + 1)^{i - 1} f(x)^{k - i + 1}f(x+1)i1f(x)ki+1 ,因为编号小于等于 iii 的石子堆做了 xxx 次操作不变为,其他石子堆做 x−1x - 1x1 次操作恰好变为 111 ,且只有石子堆 iii 变成了一个石子。因此我们在 O(w k) 时间复杂度下将问题规约到 f(x)f(x)f(x) 的计算。

我们可以基于一个数的不同质因子几乎互不影响的观察得到第一个结论。每次操作保证任何一个 eie_iei (ei>0)(e_i > 0)(ei>0) 可以减少且至少一个 eie_iei 会减少。自然而然我们可以发现一个容斥关系。

考虑 f(x)f(x)f(x) 的组成,不妨设在某种方案中第 jjj 次操作使 eie_iei 减少了 d(i,j)d(i, j)d(i,j) (非负值)。我们知道对于每个 eie_iei 有 ∑j=1xd(i,j)=ei\sum_{j = 1}^{x}{d(i, j)} = e_ij=1xd(i,j)=ei ,且对于每个 jjj 有 ∑i=1md(i,j)>0\sum_{i = 1}^{m}{d(i, j)} > 0i=1md(i,j)>0 。进一步我们能发现 f(x)f(x)f(x) 也就是分配 d(i,j)d(i, j)d(i,j) (1≤i≤m,1≤j≤x)(1 \leq i \leq m, 1 \leq j \leq x)(1im,1jx) 使其满足上述两个条件的方案数。

假设只满足第一个条件的相应方案数为 g(x)g(x)g(x) ,我们可以发现每个 iii 分别对应一个组合问题,从而是有 g(x)=∏i=1m(ei+x−1x−1)\displaystyle g(x) = \prod_{i = 1}^{m}{e_i + x - 1 \choose x - 1}g(x)=i=1m(x1ei+x1) 。

我们也可以观察到如果某些 jjj 与第二个条件产生了矛盾,与之相关的 d(i,j)d(i, j)d(i,j) 都会是零。利用容斥原理可以得到 f(x)=∑y=0x(−1)x−y(xy)g(y)\displaystyle f(x) = \sum_{y = 0}^{x}{(-1)^{x - y} {x \choose y} g(y)}f(x)=y=0x(1)xy(yx)g(y) 。这个式子可以化为一个卷积式子 f(x)x!=∑y=0x(−1)x−y(x−y)!⋅g(y)y!\displaystyle \frac{f(x)}{x!} = \sum_{y = 0}^{x}{\frac{(-1)^{x - y}}{(x - y)!} \cdot \frac{g(y)}{y!}}x!f(x)=y=0x(xy)!(1)xyy!g(y) 。因此你可以用一些方法来加速卷积,不过 985661441=235×222+1985661441 = 235 \times 2^{22} + 1985661441=235×222+1 是一个特殊的质数,所以我们推荐使用 NTT 。

总时间复杂度为 O(w m + wlognw \log nwlogn + w k),然而实现上谨慎一些也是很有必要的。

1005. Expectation Division

解决这道题需要观察到一些比较经典的结论。在分析前我们先两组与题目相关的定义:对于任意正整数的质因子分解  n=∏i=1kpiein = \prod_{i = 1}^{k}{p_i^{e_i}}n=i=1kpiei ,定义  ω(n)=k\omega(n) = kω(n)=k 表示  nnn 的不同质因子个数,  σ(n)=∑d∣n1=∑i=1k(ei+1)\sigma(n) = \sum_{d | n}{1} = \sum_{i = 1}^{k}{(e_i + 1)}σ(n)=dn1=i=1k(ei+1) 表示  nnn 的约数个数,显然有  2ω(n)≤σ(n)2^{\omega(n)} \leq \sigma(n)2ω(n)σ(n) 。

这题本来是为 OI 赛制的比赛准备的,然而没有被使用。接下来会根据几个部分分给出做法,希望能对大家有所启发。

对于 n≤106n \leq 10^6n106 的数据:

题目中所表述的过程是一个标准马尔可夫过程,所以我们可以用 f(n)f(n)f(n) 表示使用这种操作把 nnn 变成 111的期望试验次数,并且我们可以得到 f(1)=0,f(1) = 0,f(1)=0, f(n)=∑d∣nf(d)∑d∣n1+1\displaystyle f(n) = \frac{\sum_{d | n}{f(d)}}{\sum_{d | n}{1}} + 1f(n)=dn1dnf(d)+1 ,化简后为 f(n)=σ(n)+∑d∣n,d<nf(d)σ(n)−1\displaystyle f(n) = \frac{\sigma(n) + \sum_{d | n, d < n}{f(d)}}{\sigma(n) - 1}f(n)=σ(n)1σ(n)+dn,d<nf(d) 。

很容易计算出满足 n∈N+,n \in N^{+},nN+, n≤Nn \leq NnN 的所有 f(n)f(n)f(n) ,复杂度为 O(∑n≤Nσ(n))=O(NlogN)\sum_{n \leq N}{\sigma(n)}) = O(N\log N)nNσ(n))=O(NlogN),这里不再赘述。

对于 n≤1012n \leq 10^{12}n1012 的数据:

直接在线为每个询问计算答案是有些不现实的,这里给出一个考虑不同数字之间的关系并记忆化存储信息的做法。

首先观察到,对于 n=∏i=1kpiei,n = \prod_{i = 1}^{k}{p_i^{e_i}},n=i=1kpiei, m=∏i=1k′pi′ei′m = \prod_{i=1}^{k'}{{p'_i}^{e'_i}}m=i=1kpiei ,如果 k=k′k = k'k=k 并且对于 i=1,2,⋯,ki = 1, 2, \cdots, ki=1,2,,k 都有 ei=ei′e_i = e'_iei=ei (适当地安排质因子的顺序之后),那么我们可以得到 f(n)=f(m)f(n) = f(m)f(n)=f(m) ,这与具体的 pi,pi′p_i, p'_ipi,pi是多少无关。

不妨将每个数字对应的 e1,e2,⋯,eke_1, e_2, \cdots, e_ke1,e2,,ek 按非升序排序,可以观察到将这些幂指数的集合拿出来并去重后剩下集合的数量不会很多。对于一个集合 e1,e2,⋯,eke_1, e_2, \cdots, e_ke1,e2,,ek (满足非升序),我们可以构造出可能的最小值 n=2e13e25e37e4⋯n = 2^{e_1} 3^{e_2} 5^{e_3} 7^{e_4} \cdotsn=2e13e25e37e4 ,而且可以大致估计出不超过 NNN 的本质不同的幂指数的集合个数不会超过 logN\log NlogN 的分拆数数量,再利用搜索就可以确定实际的数量了,例如 N=1012N = 10^{12}N=1012 时本质不同的集合个数为 435743574357 。

事实上当 n≤1012n \leq 10^{12}n1012 时,我们可以观察到 σ(n)≤6720\sigma(n) \leq 6720σ(n)6720 ,于是每次询问时将 nnn 映射到其幂指数的集合上,利用记忆化搜索的技巧枚举约数即可以单次 O(σ(n))\sigma(n))σ(n)) 的复杂度通过测试数据。

对于 n≤1018n \leq 10^{18}n1018 的数据:

之前的方法难以奏效,因为现在有 σ(n)≤103680\sigma(n) \leq 103680σ(n)103680 并且本质不同的集合个数达到 327493274932749 个。

为了观察更细致一些,我们定义 g(n)=∑d∣nf(d)g(n) = \sum_{d | n}{f(d)}g(n)=dnf(d) ,记忆化搜索时先计算出满足 d∣n,d<nd | n, d < ndn,d<n 的所有 f(d),g(d)f(d), g(d)f(d),g(d) ,然后依次计算出 g′(n)=∑d∣n,d<nf(d),g'(n) = \sum_{d | n, d < n}{f(d)},g(n)=dn,d<nf(d), f(n)=σ(n)+g′(n)σ(n)−1,f(n) = \frac{\sigma(n) + g'(n)}{\sigma(n) - 1},f(n)=σ(n)1σ(n)+g(n), g(n)=g′(n)+f(n)g(n) = g'(n) + f(n)g(n)=g(n)+f(n) 。

尝试优化计算 g′(n)g'(n)g(n) 的过程,也即计算中的瓶颈部分。如果改用容斥的技巧,我们有 g′(n)=∑T⊆S(−1)∣T∣+1g(n∏pi∈Tpi)\displaystyle g'(n) = \sum_{T \subseteq S}{(-1)^{|T| + 1} g\left(\frac{n}{\prod_{p_i \in T}{p_i}}\right)}g(n)=TS(1)T+1g(piTpin) ,其中 S={pi∣i=1,2,⋯,k}S = {p_i | i = 1, 2, \cdots, k}S={pii=1,2,,k} ,这样可以使单次运算的复杂度从 O(σ(n))O(\sigma(n))O(σ(n)) 降到了 O(2ω(n))O(2^{\omega(n)})O(2ω(n)) 。

类似地,当 n≤1018n \leq 10^{18}n1018 时,我们可以观察到 ω(n)≤15\omega(n) \leq 15ω(n)15 ,所以这个优化在实际运算中已经足以通过 n≤1018n \leq 10^{18}n1018 的数据。

[b]对于 n≤1024n \leq 10^{24}n1024 的数据:[/b]

上述做法再次不适用了,因为现在本质不同的集合个数达到 172513172513172513 个,并且有 2ω(n)≤218≤2621442^{\omega(n)} \leq 2^{18} \leq 2621442ω(n)218262144 ,因此我们需要再次进行优化。

考虑 g(n)g(n)g(n) 的组成,所有满足 d=∏i=1kpitid = \prod_{i = 1}^{k}{{p_i}^{t_i}}d=i=1kpiti 且对于 i=1,2,⋯,ki = 1, 2, \cdots, ki=1,2,,k 有 0≤ti≤ei0 \leq t_i \leq e_i0tiei 的 ddd 都会对 g(n)g(n)g(n) 贡献一个 f(d)f(d)f(d) ,这本质上是 kkk 维前缀和。

参考大小为 kkk 的二进制子集求和(经典问题),我们可以定义 gx(n)g_x(n)gx(n) 表示对于 i=1,2,⋯,xi = 1, 2, \cdots, xi=1,2,,x 有 0≤ti≤ei0 \leq t_i \leq e_i0tiei 且对于 i=x+1,x+2,⋯,ki = x + 1, x + 2, \cdots, ki=x+1,x+2,,k 有 ti=eit_i = e_iti=ei 的 f(d)f(d)f(d) 之和,而考虑 i=xi = xi=x 时 0≤ti<ei0 \leq t_i < e_i0ti<ei 和 ti=eit_i = e_iti=ei 这两种情况,不难得到 gx(n)g_x(n)gx(n) 可以用 gx−1(n)g_{x - 1}(n)gx1(n) 和 gy(npx)g_y(\frac{n}{p_x})gy(pxn) 表示,其中 yyy 取决于 npx\frac{n}{p_x}pxn 是否依旧能整除 pxp_xpx 。这个方法可以将时间复杂度降低至每次 O(ω(n))O(\omega(n))O(ω(n)) 。

注意这个做法具体结合到非升序的幂指数序列时可能要修改一下 gx(n)g_x(n)gx(n) 的定义。

复杂度分析:

这道题的大数运算很容易在常数时间内实现。记忆化搜索时可以用 bitset 配合基数排序线性地对幂指数序列的排序,但是它是可以避免的(甚至是递归时的拷贝)。标程的时间复杂度与空间复杂度都是 O((S(N)+T)ω(N))O((S(N) + T) \omega(N))O((S(N)+T)ω(N)) ,其中 S(N)S(N)S(N) 表示在不超过 NNN 的正整数里出现的本质不同的集合个数 (S(N)≤172513)(S(N) \leq 172513)(S(N)172513) , TTT 表示数据组数,并且 ω(N)≤18\omega(N) \leq 18ω(N)18 。

1006. Function

考虑置换  aaa 的一个循环节,长度为  lll ,那么有 $f(i) = b_{f(a_i)} = b_{b_{f(a_{a_i})}} = \underbrace{b_{\cdots b_{f(i)}}}_{l\text{ times }b}$ 。

那么 f(i)f(i)f(i) 的值在置换 bbb 中所在的循环节的长度必须为 lll 的因数。

而如果 f(i)f(i)f(i) 的值确定下来了,这个循环节的另外 l−1l - 1l1 个数的函数值也都确定下来了。

答案就是 ∑i=1k∑j∣lij⋅calj\sum_{i = 1}^{k} \sum_{j | l_i} {j \cdot cal_j}i=1kjlijcalj 改为 ∏i=1k∑j∣lij⋅calj\prod_{i = 1}^{k} \sum_{j | l_i} {j \cdot cal_j}i=1kjlijcalj ,其中 kkk 是置换 aaa 中循环节的个数, lil_ili 表示置换 aaa 中第 iii 个循环节的长度, caljcal_jcalj 表示置换 bbb 中长度为 jjj 的循环节的个数。

时间复杂度是 O(n+m)\mathcal{O}(n + m)O(n+m) 。

1007. Gear Up

整个图的结构是一个森林,首先可以将共轴的齿轮看成一个块(它们角速度相同),再考虑共边的情况。

如果 xxx 和 yyy 共边, xxx 的半径为 rxr_xrx 、角速度为 ωx\omega_xωx, yyy 的半径为 ryr_yry 、角速度为 ωy\omega_yωy ,则可以知道 logωy=logωx+logrx−logry\log\omega_y = \log\omega_x + \log r_x - \log r_ylogωy=logωx+logrxlogry 。

由此可以得出每个连通分量中每个齿轮角速度与某个特定齿轮的关系,从而利用线段树维护齿轮(或块)的 dfs 序列对应的区间角速度最大值。具体来说,每个连通分量任选一个齿轮作为参照点,维护其他齿轮与其角速度的差值。每个连通分量可以看成是一棵有根树,当一个齿轮的半径发生变化时,根据其是 rxr_xrx 还是 ryr_yry 分两种情况更新一段 dfs 序区间。查询时只需要得出对应连通分量中相对角速度的最大值,再与当前点的相对角速度进行对比即可算出实际的最大值。

具体实现中可以维护 log2ω\log_2 \omegalog2ω ,在输出时再转化为 logω\log\omegalogω 。

1008. Hints of sd0061

最慢的情况是  bbb 的取值为  0,0,0,  1,1,1,  2,2,2,  3,3,3,  5,5,5,  8,8,8,  ⋯\cdots 的情况,但事实上也只有  O(log1.618n)\mathcal{O}(\log_{1.618}{n})O(log1.618n) 个取值。

从最大的取值到最小的取值依次使用近似线性复杂度的求第 kkk 小的方法即可,该方法的思想与快排相似,可以保证前 k−1k - 1k1 小的元素都放置在第 kkk 小元素的前面,这样枚举的时候就可以依次减少每次的枚举量,时间复杂度 O(∑i≥0n1.618i)=O(n)\displaystyle\mathcal{O}\left(\sum_{i \geq 0}{\frac{n}{1.618^i}}\right) = \mathcal{O}(n)O(i01.618in)=O(n) 。

1009. I Curse Myself

由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉。所以问题就变为有  MMM 个集合,每个集合里面都有一堆数字,要从每个集合中选择一个恰好一个数加起来。求所有的这样的和中,前  KKK 大的是哪些。这就是一个经典问题了。

对所有集合两个两个进行合并,设当前合并的集合是 AAA 和 BBB,合并的过程中用堆来求出当前 Ai+BjA_{i} + B_{j}Ai+Bj 的前 KKK 大值是哪些。这样的复杂度看起来为 O(MKlogK)\mathcal{O}(MK \log K)O(MKlogK),但如果合并的时候保证堆内的元素个数是新集合里的元素个数,设每个集合的大小分别为 m0,m1,⋯,mM−1m_{0}, m_{1}, \cdots, m_{M-1}m0,m1,,mM1,则复杂度为 O(∑Klogmi)=O(Klog∏mi)\mathcal{O}(\sum{K \log{m_{i}}}) = \mathcal{O}(K \log{\prod{m_i}})O(Klogmi)=O(Klogmi)。当 mim_{i}mi 都相等时取得最大值 O(MKlog∑miM)\mathcal{O}\left(MK \log{\frac{\sum{m_i}}{M}}\right)O(MKlogMmi),所以实际复杂度为 O(MK)\mathcal{O}(MK)O(MK)

事实上存在一个时间复杂度 O(MK)\mathcal{O}(MK)O(MK) 直接暴力求解的算法,但需要空间复杂度较好,例如空间复杂度 O(K)\mathcal{O}(K)O(K) 。

1010. Journey with Knapsack

标程的做法是生成函数。定义装满  kkk 体积空间的食物有  f(k)f(k)f(k) 种方案,对应的生成函数为  F(z)=∑k≥0f(k)zkF(z) = \sum_{k \geq 0}{f(k) z^k}F(z)=k0f(k)zk 。如果我们可以确定多项式  F(z)modz2n+1F(z) \bmod z^{2 n + 1}F(z)modz2n+1 的系数,那么枚举  mmm 个装备的体积即可轻松算出答案。

根据乘法原理,第 iii 种食物对 F(z)F(z)F(z) 贡献的因子是 1+zi+z2i+⋯+zaii=1−z(ai+1)i1−zi\displaystyle 1 + z^i + z^{2 i} + \cdots + z^{a_i i} = \frac{1 - z^{(a_i + 1) i}}{1 - z^i}1+zi+z2i++zaii=1zi1z(ai+1)i ,因此 F(z)=∏i=1n1−z(ai+1)i1−zi=∏i=1n(1−z(ai+1)i)∏i=1n11−zi\displaystyle F(z) = \prod_{i = 1}^{n}{\frac{1 - z^{(a_i + 1) i}}{1 - z^i}} = \prod_{i = 1}^{n}{\left(1 - z^{(a_i + 1) i}\right)} \prod_{i = 1}^{n}{\frac{1}{1 - z^i}}F(z)=i=1n1zi1z(ai+1)i=i=1n(1z(ai+1)i)i=1n1zi1 。

由于 0≤a1<a2<⋯<an0 \leq a_1 < a_2 < \cdots < a_n0a1<a2<<an 的限制,我们知道对于 i=1,2,⋯,ni = 1, 2, \cdots, ni=1,2,,n 有 ai≥i−1a_i \geq i - 1aii1 ,也即 (ai+1)i≥i2(a_i + 1) i \geq i^2(ai+1)ii2 。所以只有 O(n)\mathcal{O}(\sqrt{n})O(n) 项 (1−z(ai+1)i)\left(1 - z^{(a_i + 1) i}\right)(1z(ai+1)i) 在模 z2n+1z^{2 n + 1}z2n+1 意义下不为 111 。你可以利用类似背包的动态规划 O(nn)\mathcal{O}(n \sqrt{n})O(nn) 进行计数。

剩下的部分是 (∏i=1n11−zi)modz2n+1\displaystyle \left(\prod_{i = 1}^{n}{\frac{1}{1 - z^i}}\right) \bmod z^{2 n + 1}(i=1n1zi1)modz2n+1 ,这很像分拆数的生成函数。分拆数的生成函数被定义为 P(z)=∑k≥0p(k)zkP(z) = \sum_{k \geq 0}{p(k) z^k}P(z)=k0p(k)zk ,其中 p(k)p(k)p(k) 表示 kkk 的本质不同的拆分数量。五边形数定理表明 P(z)=1+∑k≥1(−1)k(zk(3k+1)2+zk(3k−1)2)\displaystyle P(z) = 1 + \sum_{k \geq 1}{(-1)^k \left(z^{\frac{k (3 k + 1)}{2}} + z^{\frac{k (3 k - 1)}{2}}\right)}P(z)=1+k1(1)k(z2k(3k+1)+z2k(3k1)) ,从而我们可以在需要的时候 O(mm)\mathcal{O}(m \sqrt{m})O(mm) 计算出多项式 P(z)modzmP(z) \bmod z^mP(z)modzm 。

回到原来的部分,我们做如下化简:

\displaystyle{\prod_{i = 1}^{n}{\frac{1}{1 - z^i}} \equiv \prod_{i = n + 1}^{2 n}{(1 - z^i)} \prod_{i = 1}^{2 n}{\frac{1}{1 - z^i}} \equiv P(z) \prod_{i = n + 1}^{2 n}{(1 - z^i)} \equiv P(z) \left(1 - \sum_{i = n + 1}^{2 n}{z^i}\right) \pmod{z^{2 n + 1}}}

上面的式子表明我们可以利用前缀和将其规约到 P(z)modz2n+1P(z) \bmod z^{2 n + 1}P(z)modz2n+1 。总的时间复杂度为 O(nn)\mathcal{O}(n \sqrt{n})O(nn)

1011. KazaQ's Socks

找规律即可。规律是 $\underbrace{1, 2, \cdots, n}_{n\text{ numbers}},$ $\underbrace{1, 2, \cdots, n - 1}_{n - 1\text{ numbers}},$ $\underbrace{1, 2, \cdots, n - 2, n}_{n - 1\text{ numbers}},$ $\underbrace{1, 2, \cdots, n - 1}_{n - 1\text{ numbers}},$ $\underbrace{1, 2, \cdots, n - 2, n}_{n - 1\text{ numbers}},$  ⋯\cdots 。

1012. Limited Permutation

根据  [li,ri][l_i, r_i][li,ri]  (1≤i≤n)(1 \leq i \leq n)(1in) ,我们可以尝试线性地排序并建立一棵笛卡尔树,如果产生矛盾则答案为  000 。

具体来说,我们可以依次找到能够覆盖整个区间 [L,R][L, R][L,R] 的点 uuu 。如果找不到则无解。如果找到多个,随便选一个,反正会在之后的决策中被中断。在这棵笛卡尔树上, uuu 的左孩子(如果存在)应该能覆盖 [L,u−1][L, u - 1][L,u1] ,同理它的右孩子(如果存在)应该能覆盖 [u+1,R][u + 1, R][u+1,R] ,这意味着我们可以固定区间的一个端点,排序另外一个端点得到孩子节点。最终我们可以建立一棵笛卡尔树。

若存在一棵笛卡尔树,则这棵笛卡尔树是唯一的。每棵子树都基于相似的子问题,所以我们只需要在合并子树时计算子树的组合即可。例如 uuu 有两个儿子 v1v_1v1 和 v2v_2v2 ,它们的子树对应的方案数分别为 f(v1)f(v_1)f(v1) 和 f(v2)f(v_2)f(v2) ,子树大小分别为 s(v1)s(v_1)s(v1) 和 s(v2)s(v_2)s(v2) ,则 uuu 的子树对应的方案数为 f(u)=(s(v1)+s(v2)s(v1))⋅f(v1)⋅f(v2)\displaystyle f(u) = {s(v_1) + s(v_2) \choose s(v_1)} \cdot f(v_1) \cdot f(v_2)f(u)=(s(v1)s(v1)+s(v2))f(v1)f(v2) 。

由于使用基数排序,故处理的时间复杂度为 O(n)\mathcal{O}(n)O(n) ,主要时间还是花在了读入上面。我们可以加一些读入优化使得复杂度变成 O(nlog10n)\mathcal{O}(n \log_{10}{n})O(nlog10n) ,其中 log10n≤6\log_{10}{n} \leq 6log10n6 。

本条目发布于 2017年7月25日。属于 多校题解分类。 作者是sensible
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值