原来的太长了,更新和使用都不方便,就分裂一下。又水一篇blog
标 * 的为有价值的题,标 ^ 的为欺诈题,标 - 的为知识点待填坑,标 ? 的表示看别人是这样做的但是没懂为什么
组队训练的题,如果是队友过的板刷题,题面又很长,就会标个“队友说是沙雕题”
1001 1007:略
1002:建一棵值域线段树,维护区间最大值
1003:建 SA,用主席树找第 k k k 小
1004:用堆找第 k k k 小,更新堆时,对于一条路径,要么加入末端点连出去最短的边,要么把最后一条边变大
1005: a a a 和 b b b 互质的话就变成 ∑ i = 1 n ∑ j = 1 i ( i − j ) [ gcd ( i , j ) = 1 ] \sum_{i=1}^n \sum_{j=1}^i (i-j)[\gcd(i,j)=1] ∑i=1n∑j=1i(i−j)[gcd(i,j)=1] 了,再化成 ∑ i ϕ ( i ) \sum i\phi(i) ∑iϕ(i) 然后杜教筛
1006:倒着做
1008:按 t i t_i ti 从大到小排序,前面每煮一条鱼会剩下 t i m o d k t_i \mod k timodk 的时间,存到堆里,到后面没鱼可煮了要钓一条煮一条的时候,就拿这个堆来优化
1009:分层递推(设 f i , x , y , n o w f_{i,x,y,now} fi,x,y,now 表示当前到了第 i i i 层,黑点放了 x x x 个,白点放了 y y y 个,当前层共有 n o w now now 个点,的答案, i i i 这一维可以优化掉)
当年他 tourist 用 4 小时 AK WF,我 *** 今天用 5 分钟 AK 网络赛,不是问题
ABC:队友说是沙雕题
D:第一问是 1 2 \frac 12 21,第二问递推一下
*E:数据结构课练习题
F:动态 Floyd
G:暴力 dp 是 O ( n k ) O(nk) O(nk) 的
H:按 局 数 A T K \frac{局数}{ATK} ATK局数 从小到大打
K:
*L:像析合树的预处理部分那样,扫描右端点,线段树维护左端点是否可行
方法一:维护 区 间 最 大 值 − 区 间 最 小 值 − 不 同 的 数 的 个 数 区间最大值-区间最小值-不同的数的个数 区间最大值−区间最小值−不同的数的个数
方法二:维护 区 间 长 度 − [ 有 多 少 个 x 满 足 x 和 x + 1 都 在 区 间 内 ] − 最 大 值 的 个 数 区间长度-[有多少个 x满足x和x+1都在区间内]-最大值的个数 区间长度−[有多少个x满足x和x+1都在区间内]−最大值的个数
方法二的代码长度是方法一的两倍
A:剥洋葱那样从外到里一圈一圈地确定给定坐标的权值,然后线段树维护一下
*B:暴力递归,欧拉降幂,指数很快就 0 0 0 的了
**C:解法一:打表,每 n \sqrt n n 打一次表,每组询问 O ( n n ) O(n \sqrt n) O(nn)
解法二: 2 i j = 2 i 2 + j 2 − ( i − j ) 2 2^{ij}=\sqrt 2^{i^2+j^2-(i-j)^2} 2ij=2i2+j2−(i−j)2,推式子 NTT
D:求的是 E ( d 2 ) + E ( d ) 2 \frac{E(d^2)+E(d)}{2} 2E(d2)+E(d), E ( d ) E(d) E(d) 和 E ( d 2 ) E(d^2) E(d2) 都是简单的拓扑递推
E:莫比乌斯反演一套打下去,前面 ∑ i = 2 k x i \sum_{i=2}^k x^i ∑i=2kxi 是等比数列求和,后面 μ ∗ i d 2 \mu * id^2 μ∗id2 用杜教筛
F:对于每个 i i i 在 [ p o s i − k , p o s i + k ] [pos_i-k,pos_i+k] [posi−k,posi+k] 找最大的转移过来
H:暴力 Floyd
*I:按照 t i t_i ti 从大到小排序,假设前 k k k 个人机洗,那么随着 x x x 递减, k k k 是递增的,维护一个凸壳
CJM:略
BEI:随便维护
*A:斐波那契博弈
D:SAM
*F:通过容斥转化为求某个点子树内距离它不超过 x x x 的点的点权和,这是个二维数点
G:回文树
H:要求的是 ∑ i = 1 n f ( i ) \sum_{i=1}^n f(i) ∑i=1nf(i) 和 ∑ i = 1 n f ( i ) i \sum_{i=1}^n f(i)i ∑i=1nf(i)i,考虑每个质数的贡献,前 O ( n ) O(\sqrt n) O(n) 个质数暴力做,后面的质数用 min25
K: O ( n 2 ) O(n^2) O(n2) 枚举对称中心, O ( n ) O(n) O(n) 计算答案
L:状压 dp,求两点距离打个表观察一下有惊喜(
BG:略
*A:方法一:每 100 个数取一次样,看下在不在给定的数组里,在的话就暴力判一下
方法二:
C:矩阵乘法优化递推
*D:要求 [ k ] x : ∏ i = 1 n ( 1 + a s i x ) [k]x:\prod_{i=1}^n(1+a^{s_i}x) [k]x:∏i=1n(1+asix),分治模任意模数 FFT,敢写敢过
E:约瑟夫,递推
F:考虑 S S S 每个本质不同的子串的贡献,因此用 SAM 维护
H:求个通项,然后大步小步预处理
*I:设 b i = [ a i ≠ a i − 1 ] a i b_i=[a_i\not= a_{i-1}]a_i bi=[ai=ai−1]ai,那么每次就是问一个矩形中( [ l , r ] [l,r] [l,r], [ x , y ] [x,y] [x,y])有多少个点,树套树或者 cdq
FH:略
BCD:队友说是沙雕题
*E: n ≤ p n \leq p n≤p 预处理, n > p n>p n>p 利用 Touchard 同余记忆化搜索
G:大力推式子,发现是递推
J: f i = ∑ j = 1 min ( X , i ) ( i − 1 j − 1 ) ⋅ ( j − 1 ) ! ⋅ f i − j f_i=\sum_{j=1}^{\min(X,i)} \binom{i-1}{j-1}\cdot (j-1)! \cdot f_{i-j} fi=∑j=1min(X,i)(j−1i−1)⋅(j−1)!⋅fi−j,移项就是 O ( n ) O(n) O(n) 递推,然后该递推的前 X X X 项都是 1 1 1(卡常)
K:高斯消元解出 p p p 然后矩阵乘法递推
BJL:略
*A:方法一:线段树维护树的直径,修改时只用修改子树 dfs 序区间的两个端点,然后维护一下每个点到根的距离以便询问两点距离,共 O ( n log 2 n ) O(n \log^2 n) O(nlog2n)
方法二:动态点分
C:每个 C C C 的贡献是有多少对 A , B A,B A,B 满足 A + B ≥ C ≥ ∣ A − B ∣ A+B \geq C \geq |A-B| A+B≥C≥∣A−B∣,用 A A A 和 B B B FFT 一下就好
D:大于 1 1 1 的数不会很多,暴力搜索就好
E:
G:
*H:每个元素维护从队尾乘到它是多少,路径压缩,bitset 加速矩阵乘法
F:贪心逐位确定,用 dp 算方案数
K:分别画半径为 a a a 和 b b b 的圆,然后分别求圆上整点,然后 two pointers 找答案
EI:队友说是沙雕题
A:作为直角点时极角排序扫一遍,作为非直角点时离线枚举直角点,然后把其余点极角排序扫一遍
D:判断 n n n 是否只含 2 2 2 和 5 5 5
F:tarjan 求边双
J:倒过来 kmp
*L:二分,然后中间每个人按照到达左出口的距离从大到小排序,贪心往右出口塞
F:略
*A:解法一:二分,然后差分约束,判负环
B: O ( 2 m m 2 ) O(2^mm^2) O(2mm2) dp(设 f i , j , k f_{i,j,k} fi,j,k 表示第 i i i 个数,与 r r r 的 lca 深度为 j j j,与 r + 1 r+1 r+1 的 lca 深度为 k k k,的贡献)
E:根只有一个,直接算每个叶子要给根贡献多少次
**H:首先只有开始和结束两个时刻是有用的。图可以看作是一棵树加 50 条边。全局按照 d i s x + c o s t x dis_x+cost_x disx+costx 进行 Dijkstra,每个点只会被松弛一次。每个点分中心维护距离队列,每个点在他点分树祖先以及 50 个关键点的队列里进行松弛。
I:递推, h i > h i − 1 h_i>h_{i-1} hi>hi−1 就乘 2 2 2, h i = h i − 1 h_i=h_{i-1} hi=hi−1 就相当于插空
J: n n n 为奇数则 3 + ( n − 3 ) 3+(n-3) 3+(n−3),为偶数则 2 + ( n − 2 ) 2+(n-2) 2+(n−2), 5 5 5 以内无解
K: w i + k ⋅ w i s u m w_i+k\cdot\frac{w_i}{sum} wi+k⋅sumwi
L: O ( n 2 ) O(n^2) O(n2) 预处理所有可能的状态,然后 O ( n q ) O(nq) O(nq) 回答询问。
A:取后一半
*B:最后一定是在四个角落结束,且是沿着矩形的边界从一个角落走到另一个角落这样的,因此就是推个组合数式子
D:DAG 计数
H:最坏情况是 b + c b+c b+c 个假人一起演真人,因此真人至少要 b + c + 1 b+c+1 b+c+1 个,特判 1 0 0 1~0~0 1 0 0
*I:暴力 dp,整数拆分压状态
J:算出每个 b b b 匹配每个 c c c 的收益,跑 KM
K:若给定点在三角形顶点上,则连到对边中点;否则按比例算一下连到对边去
AH:略
D:把 e min { a i } e^{\min\{a_i\}} emin{ai} 提取出来
-E:圆的反演
G:区间 dp,设 f i , j f_{i,j} fi,j 表示 i i i 到 j j j 这段点加上 ( i , j ) (i,j) (i,j) 这条边形成的多边形的划分数, i i i 和 j j j 必然同时连向 [ i + 1 , j − 1 ] [i+1,j-1] [i+1,j−1] 中的一个 k k k
*J:每条边算出一个存活时间。按时间分治,每条边有 log \log log 个小区间是完全存活的,用并查集维护当前连通情况,边在完全存活时加入并查集,退出时撤销,分治到底就询问
-K:答案为 n − 1 n-1 n−1 的整数拆分,五边形数
L:贪心
L:略
A:解法一:可持久化并查集
解法二:按时间树 dfs,维护一个可撤销并查集,删点或者更换集合的时候不用真删,开一个数组用于记录每个点的实际指向即可
*B:状压 dp,左边前 i i i 个点和右边后 n − i n-i n−i 个点合起来形成一个状态
看大题解
C:枚举 i i i 最高位的 1 1 1 在哪,对于 n n n 的 1 1 1 的位,有 3 3 3 种选择,对于 n n n 的 0 0 0 的位,有 2 2 2 种选择
*D:每个 d d d 单独做,设 f i , 0 / 1 f_{i,0/1} fi,0/1 表示以全 0 0 0 或者全 1 1 1 进入这棵子树所得到的答案,这可以 O ( n ) O(n) O(n) 递推
E:队友说是沙雕题
^G:那个模数不是质数,最大的质因子为 2803 2803 2803,因此等价于 n < 2803 n<2803 n<2803
*J:burnside+矩阵快速幂
GILN:略
A:dp,设 f i , j , k f_{i,j,k} fi,j,k 表示前 i i i 张卡,选了 j j j 张,加成为 k k k,的最大获利。
B:设 a x , y = − 1 a_{x,y}=-1 ax,y=−1,找另一行另一列的一个点 ( x ′ , y ′ ) (x',y') (x′,y′),则 a x , y = a x ′ , y + a x , y ′ − a x ′ , y ′ a_{x,y}=a_{x',y}+a_{x,y'}-a_{x',y'} ax,y=ax′,y+ax,y′−ax′,y′
*C:dp,枚举 i i i,每个点到 i i i 的极差可以用单调栈和树状数组维护出来,极差从左往右是下降的。考虑每次询问二分,然后发现有类似于决策单调的性质,就不用二分了。注意卡常!
D:简单莫比乌斯反演(可能直接叫容斥比较好),注意欧拉降幂
*E:按位考虑,考虑第 i i i 位和第 j j j 位,那么所有的 a a a 分为 4 类(00、01、10、11),其中 00 和 11、01 和 10 配对能产生 2 i + j 2^{i+j} 2i+j 的贡献,这个 O ( n ) O(n) O(n) 遍历一遍即可。
F:队友说是沙雕题
H:按有向边的拓扑序,对每个无向连通块跑最短路
*J:老套路,如果最后在 1 1 1 结束则是环边计一次树边计两次,如果不在 1 1 1 结束则把树边边权取负跑最短路,类似于退流
K:注意到左右矩阵的元素是一一对应的,就可以精细地写出 O ( n 2 ) O(n^2) O(n2) 的枚举
A:队友说是沙雕题
C:方法一:dp,设 d p i , j dp_{i,j} dpi,j 表示把 i i i 分配成 j j j 个元素的贡献。幸好厦门的 F 比你早出
方法二(未验证): f = g k − 1 f=g^{k^{-1}} f=gk−1
E: 最 大 流 = 总 容 量 路 径 长 最大流=\frac{总容量}{路径长} 最大流=路径长总容量,每条路径都可以有若干个阶梯状的 ( x , y ) (x,y) (x,y) 表示增加一个单位的流量需要花费 x x x,最多 y y y 次。然后用堆取 ( x , y ) (x,y) (x,y) 取到最大流为止。
G: 10 ! 10! 10! 枚举
H:把所有的 a i + 2 a i \frac{a_{i+2}}{a_i} aiai+2 和 a i + 1 a i \frac{a_{i+1}}{a_i} aiai+1 统计出来,取出现最多的 12 个。若有长度 ≥ n 2 \geq \frac n2 ≥2n 的等比子序列,则公比必在其中
M:把每一类 a , a 2 , ⋯ , a k a,a^2,\cdots,a^k a,a2,⋯,ak 抽出来暴力
BCJ:略
^*D:数据结构诈胡大师:关键点只有 O ( m ) O(m) O(m) 个,建棵虚树跑暴力,时间 O ( m 2 ) O(m^2) O(m2)
E:非叶子节点把它相关的所有边连向其中最小的那个
*F:拆点,从出度为 0 的开始倒着拓扑求 S G SG SG,注意演员不能当作对面的人
G:横纵坐标独立,聪明一点就取中位数,不聪明就三分
H:noip2018 铺设道路
ABC:略
D:状态数很少,暴力
E: O ( n 3 ) O(n^3) O(n3) 的 dp 能过(设 f i , j f_{i,j} fi,j 表示区间 [ i , j ] [i,j] [i,j] 的答案)
F:可以先让某对对称位置不一样,然后把别的换完,最后换这对位置。要讨论一下
G:合法的场数是连续的一段数,调和级数求和
*H:方法一:短边所对应的顶点一定是距离最远的,直接三分套三分
方法二:分别假定每个点是最远的,然后跑局部搜索(阉割的模拟退火),得到三个答案,可证取最小即为最后答案
*J:最大点权独立集(网络流)+字典序最小方案(贪心让每个点归属于 S S S 集或 T T T 集)
CEI:略
A:给了 20s,直接 O ( n 4 ) O(n^4) O(n4) dp
B:费用流 或 最小流 或 最大权匹配
*D:套路题。暴力生成前几个串 A i A_i Ai,直到 ∣ A i ∣ ≥ ∣ S ∣ |A_i| \geq |S| ∣Ai∣≥∣S∣。然后先判断 A i A_i Ai 是否包含 S S S,再判断 A i L A i − 1 A_i L A_i^{-1} AiLAi−1 之类的是否包含 S S S
F:数位 dp
G:暴力搜索
H:dp f i f_i fi 表示 T T T 串从 i i i 开始往后的不同的方案数
BDF:略
A:扫描线,扫描 y 轴枚举第一条线,用线段树查找覆盖最多的位置作为第二条线
*C:先放 a n 2 a_{\frac n2} a2n,然后 a n 2 − 1 a_{\frac n2-1} a2n−1,然后 a n 2 + 1 a_{\frac n2+1} a2n+1,然后 a n 2 − 2 a_{\frac n2-2} a2n−2,然后 a n 2 + 2 a_{\frac n2+2} a2n+2……
E:
*I:计蒜之道2016复赛 青云的网络设计方案。基本思想就是,分层确定,最后讨论第二第三层怎么搞
看大题解
K:2-SAT
L:算出每天需要新开多少个人,然后每天贪心地选人,优先选工作狂
*B: i i i 和 j j j 以 two pointers 的形式往前枚举(若 s j s_j sj 是 s i s_i si 的子串则 j j j 往前走,否则 i i i 往前走)
D:队友说是沙雕题
F:把 a i a_i ai 变成 gcd ( a i , m ) \gcd(a_i,m) gcd(ai,m),最多只有 m m m 的约数个不同的 a i a_i ai。在由 m m m 的约数构成的整除关系图上模拟容斥
G:讨论三种情况:A 直接在 2-3 这条边上蹲 B;A 直接在 3-4 这条边上蹲 B;A 先摸了 2 然后去 3-4 这条边上蹲 B。注意 corner case 和精度
^H:大家一起走,每一条指令最多会产生 2000 次合并,记录偏移量,暴力并查集
I:三维偏序,有两维在 1000 以内这个可以写得暴力一点
K:首先发现它是个卷积,然后写个模任意质数 NTT
M:每个集合新建一个方点,跑最短路
F:略
A:队友说是沙雕题
B:用 2 2 2 的幂来构造, n n n 为偶数时先构造 n − 1 n-1 n−1 再给 2 k − 1 2^{k-1} 2k−1 加 1 1 1
*D:把挡板建出笛卡尔树,然后分治
E:记忆化搜索 f a , b , c , k f_{a,b,c,k} fa,b,c,k 表示枚举三位,第一位数字为 a a a,第二位数字为 b b b(乘号视为 10 10 10),第三位数字为 c c c,进行了 k k k 次交换,的贡献和
K:预处理前后缀的答案,枚举换哪一位
L:模拟往回走,路径是一条链来的
A:队友说是沙雕题
B:大模拟
*C:二分,然后二元关系网络流
E:平移可以看作是一个平行四边形加上端点的两个扇形;旋转就是一个大扇形
F:推式子,是个容斥
G:两个串拼起来建个回文树
H:总共 O ( n 2 ) O(n^2) O(n2) 个游戏状态形成一幅 DAG,递推一下就好了
I:建个 trie 乱搞
K:相当于更相减损术中所有元素都会出现一次
A:无脑递推(设 f i , j f_{i,j} fi,j 表示有 i i i 堆 1 1 1、其他和为 j j j,是必胜还是必败)
B:手掰是点数减一,刀切是 log \log log
D:状压 dp(设 f i , s f_{i,s} fi,s 表示到了第 i i i 个点,状态为 s s s 的最小代价,状态是三进制的)
E:每一局 Alice 只有两种选择,是个 2-sat
*H:考虑每条边的贡献,就是两棵子树的 size 的 min \min min 的两倍
I:大模拟
*J:根据二阶差分可以算出腿数 ≤ k − 1 \leq k-1 ≤k−1 的动物,剩下的大讨论
AH:略
BCFLN:队友说是沙雕题
E:对于两个点,若他们必须相同或相反,则连一条边,那么一个连通块只有两种染色方案
G:枚举最后一次 Reset 在哪,前面的只要贪心让自己不爆牌就行了,后面的就找到最远的位置使自己恰好不爆牌,看对面爆不爆牌。后面的部分可以 two pointers
J:二分
*M:对于边长为 n n n 的矩阵,取掉左下的最大矩形、右上的最大矩形,还剩下的左上矩形和右下矩形是可以并行操作的,因此操作数大约是 f ( n ) = f ( n 2 ) + 4 f(n)=f(\frac n2)+4 f(n)=f(2n)+4
ACGH:队友说是沙雕题
B:dp,设 f i , j f_{i,j} fi,j 表示 i i i 这棵子树, i i i 状态为 j j j 的方案数,一个点有 3 种状态:作为终止端点、作为非终止端点、不是端点
E:贪心然后调整
F:枚举根,然后 hash
J:dp,设 f i , j f_{i,j} fi,j 表示到了第 i i i 块石头,选了 j j j 个 G 3 G_3 G3,所能达到的最少的奇数段数量是多少
K:线段树维护矩阵
L:网络流
EI:队友说是沙雕题
B: n n n 只有 5000 5000 5000,暴力
*C:不合法的三元组是,有两对互质一对不互质,或者有一对互质两对不互质。对于每个数算出 ( 跟 它 互 质 的 数 × 跟 它 不 互 质 的 数 ) (跟它互质的数\times跟它不互质的数) (跟它互质的数×跟它不互质的数),那么不合法的三元组每个被算了两次
D:距离平方和最小是取平均数,用 n − k n-k n−k 的滑窗算一遍
G:每个 byte 只有两种取值(阈值以上和以下分别取 w w w 最大的),然后二元关系
H:打表,暴力写得优美可以 10s 出解
K:暴力旋转(枚举一条边,再枚举另一条边套上去)套 Burnside
L:题意转化成:点集的子树并全体 +1、点集的祖先链并求和,线段树维护
A:队友说是沙雕题
B:搜索剪枝冲过去了
C:x 轴 y 轴独立,解同余方程
D:区间 dp(设 f i , j f_{i,j} fi,j 表示 [ i + 1 , j − 1 ] [i+1,j-1] [i+1,j−1] 全部删掉的最小代价)
E:总的减去不合法的,不合法的就枚举交点算一算
*F: X 3 X^3 X3 转化成,枚举 i , j , k i,j,k i,j,k,问有多少种方案使得这三盏灯全亮。状压 dp
**G:解法一:暴力找出前 1e8 个解,剪枝冲过去了???
-解法二:DAG 轻重链剖分,在重链上二分跳出去的位置,每个询问两个 log \log log
H:折半搜索,FWT
I:圆环交板子
*J:dp,设 f i , j , 0 / 1 f_{i,j,0/1} fi,j,0/1 表示考虑 i i i 的子树, i i i 这个点在它的子树里排第 j j j,它是否被选,的答案。
K:如果一个数后面有比它小的,它就一定要操作一次
A:队友说是沙雕题
B:第 i i i 个数为 11 + 710 i 11+710i 11+710i
*C:每个叉的左右两条竖线都加上,跑欧拉回路
*E:以一个关键点为根,在其他关键点的深度为 d e e p i 2 \frac{deep_i}{2} 2deepi 的祖先处打标记,标记可以下传到他其他儿子上。最后 dfs 一遍看谁的标记数量是关键点减 1
H:每种 t t t 只算一次,暴力复杂度是 O ( ∑ a ln ∑ a log n ) O(\sum a \ln \sum a \log n) O(∑aln∑alogn) 跑不满
I:先求出一个矩形边框作为金字塔底边的必要条件,再取矩形的较长的边长作为金字塔底边长
J:倒着逐位确定
K:使 A 极大,然后每个字母默认是一行,某一行空了就沿用它上一行或下一行
*L:SAM 上枚举每个结点作为 border,那么最小的 period 就是这个结点的出现位置集合的最小差分
M: O ( n 2 ) O(n^2) O(n2) 写优美一点
CDHJK:略
A:暴力
*B:树形 dp 疯狂讨论
*E:考场解法: − i n f , − i n f , 0 , 0 , ⋯ , 0 , − 1 , a -inf,-inf,0,0,\cdots,0,-1,a −inf,−inf,0,0,⋯,0,−1,a,则 std 是 1997 ( a − 1 ) 1997(a-1) 1997(a−1),他是 a a a,理想情况下 1996 ( a − 1 ) = k + 1 1996(a-1)=k+1 1996(a−1)=k+1。若 1996 1996 1996 不整除 k + 1 k+1 k+1,则把 k + 1 k+1 k+1 变大,并且修改第一位。
别人解法: − 1 , a 2 , a 3 , ⋯ , a 1999 -1,a_2,a_3,\cdots,a_{1999} −1,a2,a3,⋯,a1999,其中 ∑ i = 2 1999 a i = k + 1999 \sum_{i=2}^{1999} a_i=k+1999 ∑i=21999ai=k+1999,则 std 是 1999 ( k + 1998 ) 1999(k+1998) 1999(k+1998),他是 1998 ( k + 1999 ) 1998(k+1999) 1998(k+1999)。妙啊
I:暴力
L:四边形的四个点一定都在凸包上,旋转卡壳
*M:魔改的组合数取模,主要目标是修正组合数中 D D D 各质因子的数量,使其成为正常的组合数取模。
ABDGHJM:队友说是沙雕题
*E:找到♀最少(有多个时♂最多)的缸,称为♂缸,如果♂缸里有♂则需要再找一个♂最少的缸作为♀缸。剩下的每个缸有一个扔♂的代价和扔♀的代价,一个空缸可以减少一点扔♂的代价,于是 dp 确定最小值。注意一堆特殊情况!!
F:
I:
*K:大力推式子(枚举开头所在列和结尾所在列),最后是个斐波那契数列求和
L:出烂掉的广州一模题, a n s = 2 n 的 二 进 制 的 1 的 位 数 ans=2^{n的二进制的1的位数} ans=2n的二进制的1的位数
H:略
A:暴力
B:预处理每个询问是哪个数组的哪个版本,然后每个数组单独处理
D:二分图最大独立集
E:预处理 f i , j , k f_{i,j,k} fi,j,k 表示长度为 i i i 的序列、前 j j j 个位置不算 fixed point、共放了 k k k 个 fixed point 的方案数(全错排+组合数),然后贪心放
F:
G:树上 LIS,正常地用线段树做 LIS,每个点临走时把自己造成的影响还原回去
I:字符串处理题,每个封闭的区域都需要破一道墙
J:把每个数字的最后出现位置集合记为 s s s,那么就是在 [ 1 , s . b e g i n ( ) − 1 ] [1,s.begin()-1] [1,s.begin()−1] 里选最小的,这样一直贪心下去
FI:略
AEG:队友说是沙雕题
*B:贪心 check 每一个点,判断依据是会不会跟已选结点冲突、必需结点数量是否超过 k k k
看大题解
C:贪心,先放交点
H:二分,转化成求最长的区间使得 h r − m i d ⋅ r ≥ h l − m i d ⋅ l h_r-mid \cdot r \ge h_l-mid \cdot l hr−mid⋅r≥hl−mid⋅l,区间必有一端点在整点上,枚举整点,预处理前后缀最值
*J:从大到小枚举最大改变量,相当于每次有一个元素从自由符号变成固定符号,只需判断每相邻两个固定符号是否会贡献一个删除操作
K:dp
D:
ABCFGI:队友说是沙雕题
D:模拟
H:打表找循环节(大概几亿),然后分段打表
J:设当前处理 [ l , r ] [l,r] [l,r],把这个区间的最小值全部提取出来,贡献是个卡特兰数,剩下分成的区间递归处理
K:边拆点无脑 dominator tree
EL:
KLM:略
EFGI:队友说是沙雕题
A: 1 0 5 10^5 105 个点的 DAG 求最长反链,Dinic 跑最小链覆盖
*H:dp,设 f i , j , k f_{i,j,k} fi,j,k 表示先手 i i i 分,后手 j j j 分,先手手上握着 k k k 点,的获胜概率。发现存在循环转移:
解决方法一:无视循环迭代 100 次
解决方法二:对 f i , j , 0 f_{i,j,0} fi,j,0 进行二分,就会破掉这个环
*J:从一个点出发肯定先到左右最大值较小的那个,然后再往对面跳一步,随便维护一下
BCD:
ADE:队友说是沙雕题
B:二分,判断长度为 m i d mid mid 的连续段是否合法
C:暴力
F:枚举一个点,极角排序 two pointers
*G:每个串如果是 APP 则可以直接得到 ascii 码的和,如果是 SUB 则递归求 ascii 码和,转化成前缀询问,每次只走一个方向
H:三次最短路以后三维数点
I:先把边框和噪音去掉,然后对每一个连通块做模式识别
*J:先对前两个数、后两个数分别生成足够的后 n 3 \frac n3 3n 位相同的数对,然后暴力枚举两边的数对
K:区间 dp
EG:略
A:枚举比分情况,判断是否合法
B:一般图最大匹配,带花树
*C:每步暴力找重心
F:若 n n n 为质数的幂则二进制分组;否则找两个互质的因子就可以解了
**I:析合树计数 dp
看大题解
K: a n s = max i : t i ≤ T { t i + d i + ∑ j : t i < t j ≤ T t j } ans=\max_{i:t_i \leq T}\{t_i+d_i+\sum_{j:t_i
L:贪心
M:队友说是沙雕题
DHJ:
BEK:队友说是沙雕题
A:带很多细节的贪心
*F:考场解法:先把第二个序列补全到总长为 n + m − 1 n+m-1 n+m−1,然后 prufer 还原,途中若第一个序列不够长则把第二个序列的补全位让给第一个序列
正常解法:把第一个序列任意补全到长度为 n − 1 n-1 n−1,把第二个序列任意补全到长度为 m − 1 m-1 m−1,一定有解
J:暴力枚举 s s s,复杂度是 O ( n ) O(n) O(n) 的
*L:先贪心前 k k k 个一位一位地放
CDGHI:
BCEH:略
A:(队友做了不想看了)
*D:用 set 维护连续段。势能分析,每次操作最多增加 2 个连续段,所以连续段的总量是 O ( n ) O(n) O(n) 的
F:二维数点
G:dp,设 f i , s , t f_{i,s,t} fi,s,t 表示以 i i i 为根的子树,原本应该是 s s s 但现在却是 t t t 的方案数
I:MST 上找最大边
J: n n n 的约数都 O ( n ) O(n) O(n) 判断一下
*K:黑白染色,网络流,源点连向黑格子,黑格子连向白格子,白格子连向汇点,o 的位置流量为 1 1 1,其余位置流量为 2 2 2,这样一种流的方案就对应原图一种画法。
*L:假设从左下走到右上,竖直距离大于水平距离,那么就是找一列宽度为 1 1 1 的来游走补回多出的竖直距离,其他情况同理,稍微推推式子
M:把一个栈看成一个字符串,每次贪心找字典序最小的那个
BFLM:队友说是沙雕题
A:折半搜索
*C:dp,设 f i , j f_{i,j} fi,j 表示 A A A 数组前 i i i 个位置匹配了 j j j 个,的最小代价。转移条件是转移点到 i i i 之间不能有正在匹配的数字。单调队列转移
D:简单莫比乌斯反演
E:dp,设 f i , j , k f_{i,j,k} fi,j,k 表示用了 i i i 个数、最后一段长度为 j j j、最后一个数相对大小为 k k k 的方案数。转移就考虑是新开一段还是接在最后一段末尾
H:等价于 u u u 往外走 L − k L-k L−k 步能走到的最小边
I:枚举直角点,极角排序+two pointers
*J:GDKOI2015 青蛙跳环 x x x 和 x + n 2 x+\frac n2 x+2n 的连边情况是一样的,把它们缩为一个点,去除重边,就成了欧拉回路
K:分为 P P P 在左边、 P P P 在右边、 P P P 在中间被劈开分别计数
G:
*A:最小表示 dp(设 f i , j , k , l f_{i,j,k,l} fi,j,k,l 表示到了第 i i i 位,最小表示后第一个 2 2 2 在第 j j j 位,第一个 3 3 3 在第 k k k 位,第一个 4 4 4 在第 l l l 位的方案数)
*B:每个点更新维护一个线性基,使得基元都是最新的
看大题解
D:逃生模型( f i = max ( f i + 1 , d i s i v i ) f_i=\max(f_{i+1},\frac{dis_{i}}{v_i}) fi=max(fi+1,vidisi))
E:最短路图最小割
I:贪心
*K:枚举三次根,然后正常 g c d gcd gcd 反演套路
**L:三种前缀和分别对应三次组合数卷积
看大题解
*M:判断 1 1 1 的凸包和 − 1 -1 −1 的凸包是否有交
hdu多校怎么出成介个亚子啊
B:合唱队形,字典序方案符合贪心性质
E:考虑每一对的贡献,因此是 ∑ i = 1 n C i 2 × 1 2 × [ ∑ j = 0 ∞ ( 1 4 ) j ] n = ∑ i = 1 n i ( i − 1 ) 3 n \frac{\sum_{i=1}^n C_i^2 \times \frac12 \times [\sum_{j=0}^{\infty} (\frac14)^j]}{n}=\frac{\sum_{i=1}^n i(i-1)}{3n} n∑i=1nCi2×21×[∑j=0∞(41)j]=3n∑i=1ni(i−1)
*F:每两点都会产生贡献,因此用 FWT 算 c n t i cnt_i cnti 表示有多少个点的 x ⊕ y ⊕ z = i x \oplus y \oplus z=i x⊕y⊕z=i
-G:超现实数不平等博弈,详见 WC2018 杜老师课件
H:二元关系
I:回文树瞎搞
J:每个二进制位都问一下,所以是 n ! n! n!
K:每个区间找最大的 50 个左右暴力判断
L:枚举右端点,线段树维护左端点是否可行,那么是区间 ± 1 \pm1 ±1 的操作
B:dominator tree,写 DAG 版就好了
D:二分,然后 dp 判断
*E:式子最后化出来,前面是质数幂和(洲阁筛或 min25),后面是 i 2 ϕ ( i ) i^2\phi(i) i2ϕ(i)(杜教筛或 min25)
看大题解
F:素数分布很密集的, n n n 往前暴力找,Miller_Rabin 判一下,求阶乘用 Willson 定理
G:线段树二分
H:前缀异或和,询问区间有多少对数是不同的,带修莫队
I:暴力连边费用流卡常加乱水
K:dp,换根
A: n = 2 k − 1 n=2^k-1 n=2k−1 时答案为 1 1 1,否则答案为 0 0 0
C:分奇偶大讨论
F:吃树和休息的贡献是独立的,贪心吃树的贡献,dp(斜率优化)休息的贡献
*G:用逆序对来判断华容道是否有解,有解必有 120 步以内的解
H:二分+主席树
**I: a n s ans ans 初值为 ∑ a i \sum a_i ∑ai,每次默认加上 ∑ b i \sum b_i ∑bi,预处理 − p i -p_i −pi 标记。用一个巧妙的分块优化
看大题解
J:先把 100 以内的质数判掉,那么剩下的质数指数都 < 10 <10 <10,最小指数 c n t cnt cnt 满足 ( ⌊ n c n t ⌋ ) c n t = n (\lfloor \sqrt[cnt] n \rfloor)^{cnt}=n (⌊cntn⌋)cnt=n
*A:化成 p x ≤ b k ≤ p x − 1 \frac px \leq \frac bk \leq \frac p{x-1} xp≤kb≤x−1p,套法雷序列
B:两个数组放一起建棵 trie,然后 n n n 次贪心
*C:分别设 S S S 和 T T T 划分线段比例为 x x x 和 y y y,根据面积相等列出两个等式,大讨论解方程
D: n n n 个关键点把函数划分成 n + 1 n+1 n+1 段,每段分别求解
E:打个表观察一下就知道如何 next_permutation 了
F:扩展 kmp
G: [ x , y ] [x,y] [x,y] 外面的走法是唯一的,因此问题化成 1 1 1 走到 y − x + 1 y-x+1 y−x+1,递推一下
H:枚举对称轴暴力判,会有恶心的情况
*A:最大获利,贪心模拟网络流,合并用长链剖分
看大题解
B:随机下 LIS 长度只有 O ( n ) O(\sqrt n) O(n),按这个分层来跑 LIS 的 dp
D:队友说是沙雕题
E:枚举上下边界,线段树维护区间最大值
F:划分成 n 2 n^2 n2 个小区域,每个区域分别算答案
H: gcd ( f ( n , m ) − n , n ) = 1 \gcd(f(n,m)-n,n)=1 gcd(f(n,m)−n,n)=1,因此 f ( n , m ) − n f(n,m)-n f(n,m)−n 非常小,大概前 160 个质数那么大
-I:杨氏图表
*J:枚举根,dfs 序 dp,有用的 m m m 只有 O ( m ) O(\sqrt m) O(m) 个
*K:解法一:有用的问号不会太多,大概最后几十个,所以逐位确定就好了
解法二:倍增式的逐位确定,详见题解
L:贪心取叶子中的最大值,可证最优
A:队友说是沙雕题
*B:选 1 作根,对于每个点 i i i,它的儿子根据子树的形态(用 hash 来判)分为若干个类,那么这个点的贡献 a n s i = ( 儿 子 数 量 ) ! ∏ ( 每 个 类 的 个 数 ) ! ans_i=\frac{(儿子数量)!}{\prod (每个类的个数)!} ansi=∏(每个类的个数)!(儿子数量)!,这棵树的答案为 ∏ a n s i \prod ans_i ∏ansi,然后换根
*F:让复习最少的 n − k + 1 n-k+1 n−k+1 题时间和大于 m m m,即前 n − k + 1 n-k+1 n−k+1 题不能全被卡,那么至少能做 k k k 题
G:本质上是每次带权二分,用 dp 实现,设 f i f_i fi 表示区间长度为 i i i 时的答案,由于 f i f_i fi 单调递增,因此决策点也是单调的,可以 O ( n ) O(n) O(n)
*H:四个象限都可以归约为第一象限,然后 a = min ( a , 2 b ) a=\min(a,2b) a=min(a,2b)、 b = min ( a , b ) b=\min(a,b) b=min(a,b),那么所有情况都可以归约为先 右左右左…… 地蛇形扭,再直走
J:按 a i − b i a_i-b_i ai−bi 排序(这是先手的收益),先手和后手分别从两端开始取,注意判断 a i = 0 a_i=0 ai=0 或 b i = 0 b_i=0 bi=0 的情况
^k:设 f i f_i fi 表示从 i i i 走到 i + 1 i+1 i+1 的期望花费
*A:一顿乱推得到 g m ( n ) g_m(n) gm(n) 是两个调和级数相加(再加一些杂项),那么每 n \sqrt n n 打一次表,要用的时候再 O ( n ) O(\sqrt n) O(n) 去递推
B: a n s = 1 + ans=1+ ans=1+交点数
C:先折半搜索得到两个集合,然后对于每一位单独统计,枚举这一位是 x + y + ( x+y+( x+y+(是否进位 ) = 4 )=4 )=4(或 14 14 14),然后提取出这一位是 x x x 和 y y y 的数,双指针扫一遍统计符合进位规定的数对
E:开头一段 y 是不动的,然后看这段 y 后面是不是跟一个 z,如果是就会翻成 b,否则不动
F:枚举 10、20、50 分别用多少
*G:一条边分成两棵树,总共得到 n − 1 n-1 n−1 个直径对,双指针扫一遍统计贡献
H: n n n 次贪心,每次取异或和最大的一对
*K:设 g i g_i gi 表示 i i i 个叶子的线段树的 叶子深度乘叶子 id 的和, G i G_i Gi 表示 g i g_i gi 的前缀和,当然还要有一些辅助函数。记忆化搜索,每次只会到 ⌊ n 2 ⌋ \lfloor \frac n2 \rfloor ⌊2n⌋、 ⌊ n 2 ⌋ ± 1 \lfloor \frac n2 \rfloor \pm1 ⌊2n⌋±1 两个数,再往下走会交的,因此总量是 O ( log 2 n ) O(\log^2 n) O(log2n) 的
看大题解
C:从大到小排序,答案一定是一个前缀
E:按 x x x 从小到大排序,枚举最后一个选 x x x 的,那么它后面的全选 y y y,前面的用 set 维护与当前 x x x 最接近的 x x x,其余选 y y y
H: a i ≥ b i a_i \geq b_i ai≥bi 的可拆成独立的两个物品,这些散装的肯定是从大到小排序取前缀; a i < b i a_i
I:模拟
*K:解法一:枚举长度 l e n len len,会激活 a i ≤ l e n a_i \leq len ai≤len 的点,然后对于每个被激活的区间算它的贡献(即假设这个区间就是这么长了,然后计算每个点作为左端点时的贡献)。然后再处理那些以它为左端点长度为 l e n len len 时会遇到重复值的点
解法二:分治,每次考虑跨过中线的区间,枚举左边的端点快速计算右边有多少个端点,枚举右边的端点快速计算左边有多少个端点
BF:队友说是沙雕题
A:按 l i + r i 2 \frac{l_i+r_i}{2} 2li+ri 从小到大放
C:每种颜色平均分是最优的,答案等于总边数减去每种颜色的团。式子写出来可以分块
**D:带 x x x 的基尔霍夫矩阵,求导
看大题解
*E:dp旋根。若根把一条链分成 a a a 和 b b b 两部分,那么往 a a a 处移动产生的贡献是 ( a − 1 ) ( b + 1 ) − a b = a − b − 1 (a-1)(b+1)-ab=a-b-1 (a−1)(b+1)−ab=a−b−1,因此记录每个子树的一直到根的链数及链长和即可
*G:去掉被包含的圆,两两求公切线,得到所有切点,做凸包,对于凸包上的每条线段,若它被一个圆完全覆盖,则它的贡献是一段圆弧,否则是它本身
H: k k k 乘上 ⌊ n k ⌋ \lfloor \frac nk \rfloor ⌊kn⌋ 以内的质数,高精度
*I:分块,每个块维护一个值域前缀和(用树状数组),查询时二分。
J:大模拟,卡常
A:略
B:每个 m i m_i mi 拆成 log \log log 个小区间(这个区间表示 x i x_i xi 的后若干位是任选的),分组背包, k k k 只决定有无解,有解的话每一位的解的数量由覆盖该位的 x x x 的数量决定。
C:每个前缀假设异或和为 s s s,其最高位是第 w w w 位,那么第 w w w 位为 1 1 1 的 a i a_i ai 有唯一操作方法。
*D:mex 实际上是最大 LCP 加 1,而最大 LCP 随着字符的插入是递增的,因此建 SAM 时每次分裂出来的结点的 m a x l e n maxlen maxlen 就可以更新答案。注意特判 mex=0
E:启发式合并
*F:维护子树的 x x x 的和,询问时每个点枚举往父亲的边和往链剖重儿子的边,轻儿子的答案在修改时维护
H:实质上是个欧拉回路
I:黑白染色,则实际上是求最小顶标和,等于最大权匹配
J:如图
*K:dp,设 f i f_i fi 表示前 i i i 个字符的答案,找合法后缀可以 AC 自动机(fail 链最长为 n \sqrt n n),也可以把模板串按大于或小于 n \sqrt n n 分类然后 hash。
CLM:略
*A:2019 南京网络赛 C
*D:分成了 O ( n ) O(n) O(n) 个段,dp,设 f i , j f_{i,j} fi,j 表示前 i i i 个段放了 j j j 个数的方案数
F:正难则反,总数减去异色三角形
G:贪心,第 i i i 轮记当前最左边的空位为 w w w,先倒序把 f f f 为 i i i 的位置全部放数字,然后如果 w w w 还空着就放它
H:先转化成前缀询问。考虑 [ 0 , 2 30 ) [0,2^{30}) [0,230) 有多少数字异或 x x x 之后落在 [ 0 , r ] [0,r] [0,r] 内,会发现实际上是有 log \log log 个区间
I:dp,设 f i , j f_{i,j} fi,j 表示前 i i i 个数用了 j j j 次操作的最大和。转移就是枚举一个后缀,然后这个后缀全部变成最大值。
J:整数拆分枚举环长,判断是否合法,合法就算方案数
K:大数放中间,小数放两边
^N:两两乘起来
H:略
A:正难则反,算不得分的数对
G:该矩阵一定存在哈密顿回路,因此 k ≥ n m k \geq nm k≥nm 时一定可以遍历完整个地图, k < 12 k<12 k<12 时暴力
J:相邻两项之间会对 j j j 产生一个上界和下界的限制。于是枚举开头,二分最远的结尾