又是一场疯狂罚时的ACM

link
A
[线段树]
树上某个点的最远点一定是直径的某个端点
很老的套路,线段树动态维护直径,再用一个树状数组动态维护链长度信息即可
B
直接差分
C
[FFT]
补集转化,不合法方案就是Ai+Bj<Ck,或Ai+Ck<Bj,或Bj+Ck<Ai
显然这三个条件最多只能满足一个,于是可以直接FFT计算
这道题还卡常,n≤1000的时候必须跑暴力才能过
D
可以直接爆搜打表
或者考虑一个更优秀一些的搜索:显然确定了>1的数的填数方案后,1的个数是可以算出来的
所以只需要搜填2以上的数,随便剪下枝就跑得飞快
E
[生成函数] [多项式]
和珍珠几乎一模一样
设m0表示1至m中偶数的个数,m1表示奇数个数,那么题目就是要求
====nm0⋅(ex)m12m0n![xn]i=0∑m0(im0)(ex)i(e−x)m0−i⋅(ex)m12m0n![xn]i=0∑m0(im0)⋅(ex)2i−m0+m12m0n!i=0∑m0(im0)⋅n!(2i−m0+m1)n2m01i=0∑m0(im0)(2i−m0+m1)n直接算就行
F
[动态规划]
dp[i][j]表示当前填到i,前i位总共用了j种字符,后面所有方案的方案数
贪心从小到大考虑每一位填什么,类似于二分往左右走的过程
G
[分块] [字符串]
对询问串长度分块
预处理长度≤K的答案;>K就暴力(K实测可能只能开到5左右。。。)
暴力Hash就是类似于一个滑动窗口在字符串上面跑
因为这里的Hash是无序Hash,所以每次移动滑动窗口时直接加加减减,很方便动态维护Hash值
P.S.空间卡得很紧,具体实现可以把询问离线,空间就不用开那么多了
H
[栈]
昨天才考了一个这样的套路
用两个栈模拟队列,push
就压入栈A,pop
就弹栈B。pop
时若栈B为空,则把栈A的元素依次取出,压入栈B
复杂度显然是对的,每个元素最多被考虑3次:push
、从A转移到B、pop
这样就只用加入和回溯,而不需要删除了
I
Description
长为 n 的序列里有一个 bug ,你每次可以用 b 的代价插一个板,或者用 a 的代价确认 bug 在被已有板隔出的哪一个区间内,问最坏情况下最小代价
n,a,b≤1018
Solution
确认的次数显然不会超过O(logn),所以可以直接枚举。对于固定的确认次数来说,若第j次确认时隔出来kj个区域,那么要保证⌈∏kjn⌉≤1
这里要用到一个结论:⌈abn⌉=⌈b⌈an⌉⌉
xz会证,我只会感性理解
因为和一定差小积大,所以kj要尽量接近
最优解一定形如:k1⋯p=⌊i√n⌋,kp+1⋯i=⌊i√n⌋+1,暴力找到最小的p即可
J
[动态规划]
要求(∑A)−max{A}≤∑(S−A)≤∑A的A集合个数
把集合排序,从小到大考虑,动态维护f[i]表示和为i的方案
因为从小到大考虑,所以当前的数一定是max,直接算即可
K
[计算几何]
先枚举其中一个点,圆上的整点只有√n个,方法在这里
求出来后,由于三条边长度已知,可以求出其夹角,进而通过旋转求出另外一点坐标
L
数位dp模板题