又是一场疯狂罚时的ACM

19-9-16-1

link

A

[线段树]

树上某个点的最远点一定是直径的某个端点

很老的套路,线段树动态维护直径,再用一个树状数组动态维护链长度信息即可

B

直接差分

C

[FFT]

补集转化,不合法方案就是Ai+Bj<CkA_i + B_j< C_k ,或Ai+Ck<BjA_i + C_k < B_j,或Bj+Ck<AiB_j + C_k < A_i

显然这三个条件最多只能满足一个,于是可以直接FFT计算

这道题还卡常,n1000n\le 1000的时候必须跑暴力才能过

D

可以直接爆搜打表

或者考虑一个更优秀一些的搜索:显然确定了>1>1的数的填数方案后,11的个数是可以算出来的

所以只需要搜填22以上的数,随便剪下枝就跑得飞快

E

[生成函数] [多项式]

珍珠几乎一模一样

m0m_0表示11mm中偶数的个数,m1m_1表示奇数个数,那么题目就是要求

n![xn](ex+ex2)m0(ex)m1=n!2m0[xn]i=0m0(m0i)(ex)i(ex)m0i(ex)m1=n!2m0[xn]i=0m0(m0i)(ex)2im0+m1=n!2m0i=0m0(m0i)(2im0+m1)nn!=12m0i=0m0(m0i)(2im0+m1)n \begin{aligned} &n![x^n]\Big(\frac{e^x + e^{-x}}{2}\Big)^{m_0} \cdot (e^x)^{m_1}\\ =&\frac{n!}{2^{m_0}}[x^n]\sum_{i=0}^{m_0}\binom{m_0}{i}(e^x)^i(e^{-x})^{m_0 - i}\cdot (e^x)^{m_1}\\ =&\frac{n!}{2^{m_0}}[x^n]\sum_{i=0}^{m_0}\binom{m_0}{i}\cdot (e^{x})^{2i-m_0 + m_1}\\ =&\frac{n!}{2^{m_0}}\sum_{i=0}^{m_0}\binom{m_0}{i}\cdot \frac{(2i-m_0 + m_1)^{n}}{n!}\\ =&\frac{1}{2^{m_0}}\sum_{i=0}^{m_0}\binom{m_0}{i}(2i-m_0 + m_1)^{n} \end{aligned}

直接算就行

F

[动态规划]

dp[i][j]dp[i][j]表示当前填到ii,前ii位总共用了jj种字符,后面所有方案的方案数

贪心从小到大考虑每一位填什么,类似于二分往左右走的过程

G

[分块] [字符串]

对询问串长度分块

预处理长度K\le K的答案;>K>K就暴力(KK实测可能只能开到55左右。。。)

暴力Hash就是类似于一个滑动窗口在字符串上面跑

因为这里的Hash是无序Hash,所以每次移动滑动窗口时直接加加减减,很方便动态维护Hash值

P.S.P.S.空间卡得很紧,具体实现可以把询问离线,空间就不用开那么多了

H

[栈]

昨天才考了一个这样的套路

用两个栈模拟队列,push就压入栈A,pop就弹栈B。pop时若栈B为空,则把栈A的元素依次取出,压入栈B

复杂度显然是对的,每个元素最多被考虑3次:push、从A转移到B、pop

这样就只用加入和回溯,而不需要删除了

I

Description

长为 nn 的序列里有一个 bug ,你每次可以用 bb 的代价插一个板,或者用 aa 的代价确认 bug 在被已有板隔出的哪一个区间内,问最坏情况下最小代价

n,a,b1018n, a, b\le 10^{18}

Solution

确认的次数显然不会超过O(logn)O(\log n),所以可以直接枚举。对于固定的确认次数来说,若第jj次确认时隔出来kjk_j个区域,那么要保证nkj1\displaystyle \lceil \frac{n}{\prod k_j}\rceil \le 1

这里要用到一个结论:nab=nab\displaystyle \lceil \frac{n}{ab}\rceil = \lceil\frac{\lceil\frac{n}{a}\rceil}{b}\rceil

xz会证,我只会感性理解

因为和一定差小积大,所以kjk_j要尽量接近

最优解一定形如:k1p=ni,kp+1i=ni+1k_{1\cdots p} =\lfloor \sqrt[i]{n}\rfloor, k_{p+1\cdots i} =\lfloor \sqrt[i]{n}\rfloor+1,暴力找到最小的pp即可

J

[动态规划]

要求(A)max{A}(SA)A(\sum A) - \max\{A\} \le \sum (S - A) \le \sum AAA集合个数

把集合排序,从小到大考虑,动态维护f[i]f[i]表示和为ii的方案

因为从小到大考虑,所以当前的数一定是max\max,直接算即可

K

[计算几何]

先枚举其中一个点,圆上的整点只有n\sqrt n个,方法在这里

求出来后,由于三条边长度已知,可以求出其夹角,进而通过旋转求出另外一点坐标

L

数位dp模板题