原来的太长了,更新和使用都不方便,就分裂一下。又水一篇blog
标 * 的为有价值的题,标 ^ 的为欺诈题,标 - 的为知识点待填坑,标 ? 的表示看别人是这样做的但是没懂为什么
组队训练的题,如果是队友过的板刷题,题面又很长,就会标个“队友说是沙雕题”
2019 Official
2019ccpc网络赛
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 这一维可以优化掉)
2019 ICPC 银川 网络赛
当年他 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都在区间内]−最大值的个数
方法二的代码长度是方法一的两倍
2019 ICPC 南京 网络赛
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 是递增的,维护一个凸壳
2019 ICPC 徐州 网络赛
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,求两点距离打个表观察一下有惊喜(
2019 ICPC 南昌 网络赛
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
2019 ICPC 沈阳 网络赛
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 然后矩阵乘法递推
2019 ICPC 上海 网络赛
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 找答案
2019ccpc 秦皇岛
EI:队友说是沙雕题
A:作为直角点时极角排序扫一遍,作为非直角点时离线枚举直角点,然后把其余点极角排序扫一遍
D:判断
n
n
n 是否只含
2
2
2 和
5
5
5
F:tarjan 求边双
J:倒过来 kmp
*L:二分,然后中间每个人按照到达左出口的距离从大到小排序,贪心往右出口塞
2019ccpc 哈尔滨
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) 回答询问。
2019 ICPC Regional 南京
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:若给定点在三角形顶点上,则连到对边中点;否则按比例算一下连到对边去
2019 ICPC Regional 沈阳
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:贪心
2019 ICPC Regional 南昌
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+矩阵快速幂
2019 ICPC Regional 银川
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) 的枚举
2019 EC Final
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 抽出来暴力
2019 Sichuan Province Programming Contest
A:暴力
B:一定有一条直线使矩形在两侧,讨论两个矩形的放法
C:队友说是沙雕题
*D:树形 dp,每个点要么把它的儿子全部断掉,要么它本身作为某种颜色的根,然后保留这个颜色的虚树,其他断掉
E:meet in the middle
*G:若 Alice 先手,必胜当且仅当存在两个大于
k
k
k 的质数
p
1
,
p
2
p_1,p_2
p1,p2,使得
∣
(
x
−
p
1
)
−
(
y
−
p
2
)
∣
=
1
|(x-p_1)-(y-p_2)|=1
∣(x−p1)−(y−p2)∣=1,for 一遍判断即可;若 Bob 先手,枚举 Bob 第一步转化为 Alice 先手
H:略
^I:根据
x
i
\sqrt{x_i}
xi 为比例来分配
J:每种选择的次数都是
O
(
k
)
O(\sqrt{k})
O(k) 的,枚举两种选择的次数,unordered_map 判断另一种选择的次数
K:建一个有向图,地图上一个点能走到相邻点,当且仅当有一种问号安排方式使它走过去,那么如果从起点开始能走到环,或是走到一个点使其可以无路可走,那么就无解,否则就是最长路
F:
2020 Official
2020 CCPC 网络赛
CGJ:略
-**A:横边贡献是线段并长度,竖边的贡献是
∑
∣
a
i
−
a
i
+
1
∣
\sum |a_i-a_{i+1}|
∑∣ai−ai+1∣,用 segment tree beats 维护
B:min25 卡常
*D:对于一个询问,二分一个
m
i
d
mid
mid(实际不用二分),权值大于
m
i
d
mid
mid 的点叫黑点,否则叫白点。从黑点开始反向 bfs,黑点能到达的先手点也都是黑点,只能到达黑点的后手点也是黑点。然后去掉二分,改为点权从大到小加入
E:解法一:打表看
S
G
SG
SG
解法二:如果没有因子
2
2
2 那么就是“质因子个数”的 nim 游戏;质因子 2 的话只要点了就会变成
S
G
=
0
SG=0
SG=0,所以假设质因子 2 是最后点的,那么就相当于所有的质因子 2 都合并成一个,所以
S
G
(
n
)
=
n
的
奇
质
因
子
个
数
+
[
n
是
偶
数
]
SG(n)=n 的奇质因子个数+[n是偶数]
SG(n)=n的奇质因子个数+[n是偶数]
*H:每一层已探索的门一定是连续的一段区间,因此可以 dp 设
f
i
,
l
,
r
,
0
/
1
f_{i,l,r,0/1}
fi,l,r,0/1 表示当前在第
i
i
i 层,已探索了
[
l
,
r
]
[l,r]
[l,r] 的门,当前在
l
l
l 还是
r
r
r,的期望
^K:
K
K
K 矩阵相当于重新分配
A
A
A 矩阵的元素权值,若
K
1
,
1
≠
1
K_{1,1} \not =1
K1,1=1,则无穷步之后
A
A
A 的值都会泄漏到矩阵外面去
*L:容斥转化成
x
−
y
>
K
x-y>K
x−y>K 或
y
−
x
>
K
y-x>K
y−x>K,然后大力数位 dp
M:转化成若干个单项式相乘
FI:
2020 ccpc 威海
DH:队友说是沙雕题
A:
min
(
max
(
2
n
t
,
2
t
+
x
)
,
max
(
(
2
n
+
1
)
t
,
t
+
x
)
)
+
2
n
t
\min(\max(2nt,2t+x),\max((2n+1)t,t+x))+2nt
min(max(2nt,2t+x),max((2n+1)t,t+x))+2nt
B:每个障碍周围 8 个点都是关键点,关键点之间做 Floyd,算答案的时候枚举起点到哪个关键点,终点到哪个关键点,又注意到每个障碍物对于起点、终点各只有一个关键点是有用的,因此
O
(
q
k
2
)
O(qk^2)
O(qk2)
C:考虑每条边的贡献,当且仅当这条边一侧有 1 人、另一侧有 2 人时有贡献
*F:opentrain6277D 逐层分解,每次找到度数最小的点(一定是最外层的),然后用双源 bfs 剥离最外层
G:线段树维护 hash,要双 hash
*J:黑堆的
S
G
SG
SG 值只与黑堆最小值及其重复次数、是否等于最大值有关,枚举最小的黑堆及其重复次数,后面就是个线性基
*K:
p
1
,
⋯
,
p
l
−
1
p_1,\cdots,p_{l-1}
p1,⋯,pl−1 分出了若干个大区间,每个大区间独立操作,每个大区间里又会被
p
l
,
⋯
,
p
r
p_l,\cdots,p_r
pl,⋯,pr 分成
O
(
r
−
l
)
O(r-l)
O(r−l) 个小区间,在这里做区间 dp
L:
x
i
x_i
xi 只考虑质数,多重背包
EI:
2020 ZJCPC
AK:略
BE:队友说是沙雕题
C:建 trie 或者直接字符串哈希,卡常
F:把 AI 实验课写的 PLA 贴上来
G:只能是从起点开始沿
v
i
v_i
vi 递增的路线走到某个风洞,然后从这个风洞直接走到终点,因此
O
(
n
2
)
O(n^2)
O(n2) 枚举
H:共
O
(
n
m
)
O(nm)
O(nm) 个关键点,相邻关键点之间的线段逐一判断
I:这是一幅若干简单环组成的图,最大环即为答案
*L:快排法求第
k
k
k 小
DJ:
2020 ICPC 小米邀请赛
中国大陆全明星赛
**B:分治,跨过当前分治中线的区间的答案只有三种:左边后缀的最大子段、右边前缀的最大子段、左边后缀的最大后缀+右边前缀的最大前缀,预处理出左边每个后缀的最大子段、最大后缀,枚举右边前缀,讨论三种情况都是二维数点算方案数
*E:要么除以 2 然后调整,要么会拆成
a
,
b
a,b
a,b 两个数,其中
a
a
a 比
b
b
b 多一位,dp 求最优
G:
O
(
3
n
)
O(3^n)
O(3n) 状压 dp,
S
G
SG
SG 从小到大做的话每次找一个极大独立集,从大到小做的话每次找一个集合连向已选的所有点
I:只要发现爆阈值是一定不会发生的话(因为爆之前回答问题一定会更优),就是个简单 dp 了
J:状压,从上往下放,已有的书的重心要么在新书的左边界,要么在右边界
K:暴搜,bfs 的队列最大只会到 1300 多
ACDFHLM:
2020 ccpc 秦皇岛
AE:略
F:每个连通块的
max
(
0
,
边
数
−
点
数
)
\max(0,边数-点数)
max(0,边数−点数) 加起来
G:枚举开根后的数
J:枚举
d
d
d 然后枚举余数段,余数段每次往右移一段时对方案数的影响是
O
(
1
)
O(1)
O(1) 计算的
K:树形 dp,假设每棵子树 1 个兵开局,则这个兵最后会在最深的叶子上,那么就把儿子按最深叶子深度排序,依次枚举,如果把兵从它最深的叶子提上来的代价超过从根再派一个过来,就从根再派一个过来
BDHIL:
2020 ccpc 长春
2020 ICPC Regional 南京
^D:度数本身就
≤
n
2
\le \frac n2
≤2n 的点直接 Kruskal 合并,剩下的边 random_shuffle 1000 次左右
EF:队友说是沙雕题
H:若
n
=
1
n=1
n=1 或
m
=
1
m=1
m=1 无解;若
n
>
7
n>7
n>7 或
m
>
7
m>7
m>7 则任意方案都合法;否则爆搜
*I:二分答案,按
y
y
y 关键点从小到大维护可行的
x
x
x 坐标段
*J:询问操作等价于找有多少个
a
i
a_i
ai 满足它的二进制第
b
b
b 位为
1
1
1(其中
b
b
b 是这次游戏
S
G
SG
SG 值的最高位),因此 segment tree beats 维护区间异或和、区间每个二进制位为
1
1
1 的数量
K:前
k
k
k 位 shift 一下
L:找区间最长的
a
a
a 连续段
M:经典的“看上去是
O
(
n
3
)
O(n^3)
O(n3) 实际上是
O
(
n
2
)
O(n^2)
O(n2) 的树型 dp”
ABCG:
2020 ICPC Regional 济南
A:每一列单独考虑,对
A
A
A 矩阵推一下式子是一个线性基
C:尽量避免两个
2
2
2 合并
D:队友说是沙雕题
*F:
G:根据
y
y
y 的最高位在
x
x
x 那里是不是
1
1
1 讨论一下
*H:min-max 容斥,转化为求各种链并大小的方案数。设
d
p
i
,
j
,
k
dp_{i,j,k}
dpi,j,k 表示
i
i
i 这棵子树,链并为
j
j
j,目前有条链往上最长延伸了
k
k
k,的方案数。转移都是前后缀转移,因此是
O
(
n
3
)
O(n^3)
O(n3) 的
*J:2 位作为奇偶层标记位(奇
01
01
01 偶
10
10
10,这样使得同为奇层或同为偶层的不会相互连边),然后选择奇层和偶层较小的一方作为标记层(最多 50 个点),标记层的结点获得
1
1
1 至
50
50
50 的编号,在
50
50
50 位中把它编号的那一位填
0
0
0 其他位填
1
1
1;非标记层的结点默认
50
50
50 位全
0
0
0,相邻的标记结点编号填
1
1
1。
L:直接枚举
x
x
x 的最后 8 位、8 位后的连续 1 的数量、总共的 1 的个数
M:
max
(
2
,
⌈
2
n
k
⌉
)
\max(2,\lceil\frac{2n}{k}\rceil)
max(2,⌈k2n⌉)
BEFIK:
2020 ICPC Regional 昆明
好耶,大学生和中学生互相给对方出原题
A:可撤销贪心。问题转化成有若干个元素,每个元素有代价
v
i
v_i
vi,相邻元素不能同时选,问
m
m
m 代价以内最多选多少个。每选一个元素,就把左右的元素合并起来,代价为
v
i
−
1
+
v
i
+
1
−
v
i
v_{i-1}+v_{i+1}-v_i
vi−1+vi+1−vi,用堆维护。
*B:上下界最小费用可行流,先假设全放白棋,那么第
i
i
i 行连向第
j
j
j 列两条边,一条费用
−
s
w
i
j
-sw_{ij}
−swij 表示不放棋,一条费用
s
b
i
j
sb_{ij}
sbij 表示放黑棋,注意负环消圈
*C:区间 dp,设
d
p
l
,
r
dp_{l,r}
dpl,r 表示区间
[
l
,
r
]
[l,r]
[l,r] 合并成同色的最小步数,观察到最后该区间的颜色一定是端点的颜色,因此可以只对该区间内端点颜色的点做背包,复杂度
O
(
n
2
+
n
⋅
1
5
2
)
O(n^2+n\cdot 15^2)
O(n2+n⋅152)
*D:
n
∣
k
n
n | k^n
n∣kn
-F:出题人说是抄 17 集训队论文的回文树
G:按生日排序,设
d
p
i
,
j
,
k
dp_{i,j,k}
dpi,j,k 表示考虑了前
i
i
i 个人,空了
j
j
j 个人没做蛋糕(如果
j
>
m
j>m
j>m 就视为
j
=
m
j=m
j=m),总共花了
k
k
k 天做蛋糕,的最大收益
H:
2020
+
x
2020+x
2020+x
I:队友说是沙雕题
J:观察到,任意的环可以一步变成若干个二元环,因此答案最多为 2
K:依次枚举:摸到哪张牌、打掉哪张牌、雀头、刻子
L:
a
n
s
i
=
(
a
1
,
⋯
,
a
i
的
最
长
下
降
子
序
列
长
度
)
ans_i=(a_1,\cdots,a_i 的最长下降子序列长度)
ansi=(a1,⋯,ai的最长下降子序列长度)
*M:每次询问,置
m
e
x
mex
mex 初始为
1
1
1,看
(
l
a
s
t
_
m
e
x
,
m
e
x
]
(last\_mex,mex]
(last_mex,mex] 之间是否有数,有就把
l
a
s
t
_
m
e
x
←
m
e
x
last\_mex \gets mex
last_mex←mex,把
m
e
x
+
=
(
l
a
s
t
_
m
e
x
,
m
e
x
]
中
的
数
求
和
mex += (last\_mex,mex] 中的数求和
mex+=(last_mex,mex]中的数求和,否则结束。可以证明这是
O
(
log
a
)
O(\log a)
O(loga) 的
E:
第十一届山东省大学生程序设计竞赛
B:
n
≤
1000
n \le 1000
n≤1000 时直接 Kruskal,
n
n
n 大时直接是
n
−
1
n-1
n−1,注意
L
=
R
L=R
L=R
C:倍增。一棵子树如果加一个兄弟和父亲,那么方案
×
2
+
1
\times 2+1
×2+1;如果只加一个父亲,那么方案
+
1
+1
+1
D:队友说是沙雕题
F:两个字符串拼起来,一定是一个串形如
a
a
a 另一个串形如
b
a
b
bab
bab,因此枚举每个串的 boarder 然后 hash 寻找有没有
a
a
a
G:高精度除法
H:队友说是沙雕题
I:用线段树维护每个位置的权重,以及区间和,乘法标记可不下传,注意模数是 3 和 7 的倍数因此要记下这两个因子的次数
*J:解法一:设
d
p
i
,
j
dp_{i,j}
dpi,j 表示考虑了能力值前
i
i
i 的人,当前剩余
j
j
j 个老师,的最大收益。
j
j
j 只开 500 然后卡常
*M:
A
A
A 矩阵奇数行全 1 且第 1 列全 1,
B
B
B 矩阵偶数行全 1 且最后一列全 1
AEKL:
2021 Official
2021 CCPC 网络赛 1
A:略
B:一个周期不超过 27720,直接求出来然后随便搞搞
*E:解法一:写成矩阵乘法:
a
n
s
=
v
i
n
i
t
∑
i
=
1
n
∑
j
=
1
n
(
i
+
j
i
)
A
i
B
j
ans=v_{init}\sum_{i=1}^n\sum_{j=1}^n\binom{i+j}{i}A^iB^j
ans=vinit∑i=1n∑j=1n(ii+j)AiBj,然后 NTT
解法二:写成通项公式:
a
n
s
=
∑
i
=
1
n
∑
j
=
1
n
(
i
+
j
i
)
(
α
i
λ
1
j
+
β
i
λ
2
j
)
ans=\sum_{i=1}^n\sum_{j=1}^n\binom{i+j}{i}(\alpha_i \lambda_1^j+\beta_i \lambda_2^j)
ans=∑i=1n∑j=1n(ii+j)(αiλ1j+βiλ2j),然后 NTT
解法三:令
f
(
i
)
=
∑
j
=
1
n
(
i
+
j
i
)
A
i
B
j
f(i)=\sum_{j=1}^n\binom{i+j}{i}A^iB^j
f(i)=∑j=1n(ii+j)AiBj,求出
f
(
i
)
f(i)
f(i) 与
f
(
i
+
1
)
f(i+1)
f(i+1) 的递推关系
F:
(
8
2
−
7
2
)
−
(
6
2
−
5
2
)
=
4
(8^2-7^2)-(6^2-5^2)=4
(82−72)−(62−52)=4,即连续 4 个数可以得到一个 4。利用这个来构造
G:枚举
g
(
x
)
g(x)
g(x),最值只在端点和对称轴取,因此在符合条件的
x
x
x 里找 lowerbound 和 upperbound
I:前缀和 hash
*J:最多走 6 步就全是
b
i
b_i
bi 了,因此用高斯消元算出全
b
i
b_i
bi 的情况,前 6 步 dp
K:简单 dp
L:每个
i
i
i 实际上是转移到前面的某个
p
p
p 的倍数,而由于答案是单调的,所以这个
p
p
p 应是
i
i
i 的质因子里最大的
*M:讨论三种情况的凸包求切
BCH:
2021 CCPC 网络赛 2
1002:提神醒脑讨论题
^1004:解法一:质数间隔很小,直接上 Miller_Rabin,暴力枚举
f
(
x
)
f(x)
f(x) 和
f
(
f
(
x
)
)
f(f(x))
f(f(x))
解法二:如果
f
(
x
)
>
2
f(x)>2
f(x)>2,那么
g
(
x
)
g(x)
g(x) 一定是整数,且在两个相邻的素数之间,所以一定是合数
1005:求出周期
p
p
p,假设
p
>
0
p>0
p>0,记
s
i
s_i
si 为
a
i
a_i
ai 的前缀和,那么就是求
min
i
∣
s
i
≡
x
(
m
o
d
p
)
x
−
s
i
p
+
i
\min_{i|s_i\equiv x\pmod p} \frac{x-s_i}{p}+i
mini∣si≡x(modp)px−si+i,将
−
s
i
−
(
s
i
m
o
d
p
)
p
+
i
-\frac{s_i-(s_i \bmod p)}{p}+i
−psi−(simodp)+i 按
s
i
m
o
d
p
s_i \bmod p
simodp 分类放好,那么求答案就是个前缀最小值
1006:找到所有的 nunhehheh,统计后面的 a 的个数
1007:假做法:格子要么是链(两头可能封闭)要么是环,先把有开口的链全部归先手,剩下的两头封闭链和环从小到大排序分奇偶给先手后手
1009:队友说是沙雕题
*1010:最终形态就是
2
n
2n
2n 个点形成一个大环,所以贪心,左边每个点依次去找右边的不跟它同一连通块的最小点
1011:按点权从小到大激活每个点,激活一个点意味着它相邻的连通块全部跳到它,因此每个点跳跃路径形成一棵树
1001 1003 1008 1012:
2021 Jiangxi Provincial Collegiate Programming Contest
A:
O
(
n
3
)
O(n^3)
O(n3) dp,注意空间
BCD:队友说是沙雕题
*E:最多只能跑一个兵,所以判断:1、是否有兵能直接逃;2、是否有两个兵的横差大于纵差,这样这两个兵不能同时被吃;3、特判一个兵在另一个兵的直接左上角,这时两个都可以吃
F:dp
*G:按
1
e
6
\sqrt{1e6}
1e6 分为小质数和大质数,小质数暴力,大质数相当于求区间众数,莫队
*H:如果不能开局打死后手,那么后手必胜
*I:每个人要么是
a
i
a_i
ai,要么是某个
a
j
+
d
i
s
(
j
,
i
)
a_j+dis(j,i)
aj+dis(j,i),旋根 dp
J:解法一:二分+链表 check
解法二:预处理每个数至少要多大的 cache 才能使其命中
K:平方和公式
L:线段树求区间并
其他 ICPC/CCPC
The 13th Chinese Northeast Collegiate Programming Contest (2019CNCPC)
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 铺设道路
2010 ICPC Regional Dhaka
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 集)
2013 Southwestern Europe Regional Contest (SWERC 13)
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 开始往后的不同的方案数
2018 ICPC Regional Seoul
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:算出每天需要新开多少个人,然后每天贪心地选人,优先选工作狂
2015 ICPC Regional 沈阳
*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:每个集合新建一个方点,跑最短路
2015 ICPC Regional 上海
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:模拟往回走,路径是一条链来的
2014 ICPC Regional 西安
A:队友说是沙雕题
B:大模拟
*C:二分,然后二元关系网络流
E:平移可以看作是一个平行四边形加上端点的两个扇形;旋转就是一个大扇形
F:推式子,是个容斥
G:两个串拼起来建个回文树
H:总共
O
(
n
2
)
O(n^2)
O(n2) 个游戏状态形成一幅 DAG,递推一下就好了
I:建个 trie 乱搞
K:相当于更相减损术中所有元素都会出现一次
2011 ICPC Regional 成都
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 的动物,剩下的大讨论
2019 ICPC Regional Southern and Volga Russian (NERC)
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
2019 ICPC Regional Jakarta
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:网络流
2014 ICPC Regional 鞍山
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、点集的祖先链并求和,线段树维护
2014 ICPC Regional 北京
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:如果一个数后面有比它小的,它就一定要操作一次
2019 ICPC Regional North-Western Russia
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) 写优美一点
2019 ICPC Regional Taipei-Hsinchu
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 各质因子的数量,使其成为正常的组合数取模。
2019 ICPC Subregional Brazil
ABDGHJM:队友说是沙雕题
*E:找到♀最少(有多个时♂最多)的缸,称为♂缸,如果♂缸里有♂则需要再找一个♂最少的缸作为♀缸。剩下的每个缸有一个扔♂的代价和扔♀的代价,一个空缸可以减少一点扔♂的代价,于是 dp 确定最小值。注意一堆特殊情况!!
F:
I:
*K:大力推式子(枚举开头所在列和结尾所在列),最后是个斐波那契数列求和
L:出烂掉的广州一模题,
a
n
s
=
2
n
的
二
进
制
的
1
的
位
数
ans=2^{n的二进制的1的位数}
ans=2n的二进制的1的位数
2019 ICPC Regional North American Southeast (Div 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] 里选最小的,这样一直贪心下去
2019 ICPC Regional Northwestern European (NWERC 2019)
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:
2019 ICPC Regional Southwestern European (SWERC 2019-20)
ABCFGI:队友说是沙雕题
D:模拟
H:打表找循环节(大概几亿),然后分段打表
J:设当前处理
[
l
,
r
]
[l,r]
[l,r],把这个区间的最小值全部提取出来,贡献是个卡特兰数,剩下分成的区间递归处理
K:边拆点无脑 dominator tree
*L:观察发现每条河流的每段陆地连通块大小不超过 20,因此可以每段状压暴力算 SG
E:
2019 ICPC Regional Latin American
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:
2018 ICPC Regional Southwestern European (SWERC 2018)
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
2018 ICPC NEERC Northern Eurasia Finals
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<t_j \leq T} t_j\}
ans=maxi:ti≤T{ti+di+∑j:ti<tj≤Ttj},线段树随便维护一下
L:贪心
M:队友说是沙雕题
DHJ:
2019 ICPC NERC Northern Eurasia Finals
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:
2017 ICPC Regional Latin American
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:把一个栈看成一个字符串,每次贪心找字典序最小的那个
ICPC Egyptian Collegiate Programming Contest (ECPC 2018)
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:
2020 ICPC Asia Taipei-Hsinchu Site Programming Contest
ABM:队友说是沙雕题
C:
O
(
n
2
)
O(n^2)
O(n2) 暴力冲过去了 std 甚至连空间都是
O
(
n
2
)
O(n^2)
O(n2) 的
*D:先把度数
>
28
>28
>28 的点去掉,剩下的搜索
*E:区间 dp,设
d
p
l
,
r
dp_{l,r}
dpl,r 表示
[
l
,
r
]
[l,r]
[l,r] 消掉是否可行,再设
f
l
,
r
f_{l,r}
fl,r 表示
[
l
,
r
]
[l,r]
[l,r] 这段消掉某些区间之后最多剩下多少个颜色
s
l
s_l
sl
F:环套树最小点覆盖,对于一条环边枚举某一端点作根然后断掉这条边形成树做 dp
G:树哈希+最小表示
H:MST
I:点双模板题
K:数位 dp 但是不用 dp,从高位到低位依次枚举前
i
i
i 位压线,用排列算方案数
JL:
EC-Final 2017
A:
2
n
−
∑
i
=
0
k
−
1
(
n
i
)
2^n-\sum_{i=0}^{k-1}\binom{n}{i}
2n−∑i=0k−1(in)
B:均值是固定的,每个
a
i
a_i
ai 关于
m
i
m_i
mi 的代价的一阶导也是递增的,所以直接贪心
*C:只要等了红灯接下来必定全程绿灯,而他一定可以选择在某个灯下等红灯,因此是
∑
s
+
max
b
i
\sum s+\max b_i
∑s+maxbi
H:LIKE就是全部选元音或全部选辅音,存在DISLIKE可以用 dp 或者贪心
J:实际上是每次选的长度
≥
3
\ge 3
≥3 都可以,差分之后贪心
KM:略
*L:只要摆出 S _ _ S 这样的局面,且其余的空位数量是偶数,那么先手必胜了,因此:
n
≤
6
n \le 6
n≤6 暴力(全部是平局);
7
≤
n
≤
15
7 \le n \le 15
7≤n≤15 若
n
n
n 奇数则先手胜否则平局;
n
>
15
n>15
n>15 若
n
n
n 奇数则先手胜否则后手胜
DEFGI:
2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)
*A:两维独立,每一维任务是找出
x
1
≤
x
2
≤
⋯
≤
x
n
x_1 \le x_2 \le \cdots \le x_n
x1≤x2≤⋯≤xn 使得
∑
(
x
i
−
a
i
)
2
\sum(x_i-a_i)^2
∑(xi−ai)2 最小。枚举
i
i
i,若当前
x
i
−
1
≤
a
i
x_{i-1} \le a_i
xi−1≤ai 则令
x
i
=
a
i
x_i=a_i
xi=ai;否则
x
i
x_i
xi 要跟
x
i
−
1
x_{i-1}
xi−1 相等(可能还要跟更前的相等),并整体左移
B:按拓扑序的倒序依次贪心确定
C:取
α
=
180
°
n
\alpha=\frac{180\degree}{n}
α=n180°,然后各点按 dfs 序依次确定角度,间隔
α
\alpha
α
*D:二分答案
m
i
d
mid
mid,找出
[
a
,
b
]
[a,b]
[a,b] 时间段内能游走的子图,按
d
i
s
(
1
,
x
)
≤
a
+
m
i
d
−
d
i
s
(
x
,
n
)
dis(1,x) \le a+mid-dis(x,n)
dis(1,x)≤a+mid−dis(x,n) 标出子图的起点,如果子图有环则一定合法,否则在 DAG 上 dp 出最长逗留时间
看大题解
E:shuffle 和 sort 都相当于是在一个集合上标注这是 shuffle 还是 sort
*F:解法一:朱刘硬艹
解法二:
s
s
s 边形成环套外向树,默认每个点都是通过树边通关的,每棵树默认都是用
n
n
n 来破开环的,所以问题转化成从
0
0
0 通关
n
n
n 的最短时间,
O
(
n
2
)
O(n^2)
O(n2) dp
G:从起点往外分成若干圈,每一步都要走到更外面的一圈即可
H:贪心即可,注意相邻的 0 之间的贡献只能是偶数
IJK:队友说是沙雕题
2020-2021 ACM-ICPC Latin American Regional Programming Contest
A:归纳可证所有数都形如
1
/
n
1/n
1/n,因为
1
/
n
1/n
1/n 与
1
/
m
1/m
1/m 运算得到
1
/
(
n
+
m
)
1/(n+m)
1/(n+m),因此暴力+打表
B:枚举段长,预处理每个数的左右上升下降
CDE:队友说是沙雕题
F:
O
(
n
2
)
O(n^2)
O(n2) dp
*H:相当于问有向图从 1 出发,有些边能经过无数次,有些边只能经过一次,问最多经过 1 号点多少次。将 1 号点拆点,网络流
*J:合法的机器数和包含关系不多,建出图,按度数根号平衡
K:
O
(
k
n
)
O(kn)
O(kn) dp
L:暴力枚举初始时刻,
O
(
n
)
O(n)
O(n) 判断
*M:后缀平衡树
N:看小数点后的数的和模
100
100
100
GI:
hdu 多校
2019 Multi-University Training Contest 1
*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 的凸包是否有交
2019 Multi-University Training Contest 2
hdu多校怎么出成介个亚子啊
B:合唱队形,字典序方案符合贪心性质
E:考虑每一对的贡献,因此是
∑
i
=
1
n
(
i
2
)
×
1
2
×
[
∑
j
=
0
∞
(
1
4
)
j
]
n
=
∑
i
=
1
n
i
(
i
−
1
)
3
n
\frac{\sum_{i=1}^n \binom{i}{2} \times \frac12 \times [\sum_{j=0}^{\infty} (\frac14)^j]}{n}=\frac{\sum_{i=1}^n i(i-1)}{3n}
n∑i=1n(2i)×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 的操作
2019 Multi-University Training Contest 3
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,换根
2019 Multi-University Training Contest 4
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
2019 Multi-University Training Contest 5
*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:枚举对称轴暴力判,会有恶心的情况
2019 Multi-University Training Contest 6
*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:贪心取叶子中的最大值,可证最优
2019 Multi-University Training Contest 7
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 的期望花费
2019 Multi-University Training Contest 9
*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) 的
看大题解
2019 Multi-University Training Contest 10
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<b_i
ai<bi 的最多只有一个人是只选
a
a
a 的,因此枚举
a
i
<
b
i
a_i<b_i
ai<bi 的这些里面选了多少个
a
i
+
b
i
a_i+b_i
ai+bi 就行了,这个有单调性
I:模拟
*K:解法一:枚举长度
l
e
n
len
len,会激活
a
i
≤
l
e
n
a_i \leq len
ai≤len 的点,然后对于每个被激活的区间算它的贡献(即假设这个区间就是这么长了,然后计算每个点作为左端点时的贡献)。然后再处理那些以它为左端点长度为
l
e
n
len
len 时会遇到重复值的点
解法二:分治,每次考虑跨过中线的区间,枚举左边的端点快速计算右边有多少个端点,枚举右边的端点快速计算左边有多少个端点
2020 Multi-University Training Contest 1
D:特判
n
≤
3
n \le 3
n≤3,当
n
>
3
n>3
n>3 时字符串一定是
a
b
c
a
b
c
a
b
c
⋯
abcabcabc\cdots
abcabcabc⋯ 的形式
E:直接用斐波那契的通项公式来推,二项式展开+等比数列
*F:lxl 时间 以度数是否大于
n
\sqrt n
n 分为大点和小点
I:按初始距离从大到小进栈(保证栈底到栈顶依次称王),每新来一个人,如果它能在栈顶称王之前就取代它,那么栈顶退栈
L:凸多边形往内缩
r
r
r 的距离得到新凸包(用半平面交实现),然后做半径为
r
r
r 的圆角凸包,这就是能被圆覆盖到的面积
ABCGHJK:
2020 Multi-University Training Contest 2
A:每次肯定选整个连通块一直减,直到连通块分裂。倒序做,每次合并的时候计算贡献
E:最小权匹配,每个工人只用连二次函数最值点附近 60 条边即可。用单路增广费用流
G:二分一个
m
i
d
mid
mid,然后树形 dp 判定,设
f
i
,
j
f_{i,j}
fi,j 表示以
i
i
i 为根的子树,改了
j
j
j 条边,保证自身直径不超过
m
i
d
mid
mid 的情况下,到
i
i
i 的路径的最大长度最小是多少
H:李超树
I:暴力枚举框出来的每个格子,时间复杂度是对的。具体实现用射线法判断每个格子是否在多边形中
J:爆搜+剪枝
L:dp,设
f
i
,
j
,
k
f_{i,j,k}
fi,j,k 表示
A
A
A 到了第
i
i
i 位,
B
B
B 到了第
j
j
j 位,lcs 为
k
k
k,的最大左端点是谁。查询时从大到小枚举
a
n
s
ans
ans,若发现
f
r
,
∗
,
a
n
s
≥
l
f_{r,*,ans} \ge l
fr,∗,ans≥l,则
a
n
s
ans
ans 合法
BCDFK:
2020 Multi-University Training Contest 3
DE:队友说是沙雕题
C:每一位单独考虑,动态开点线段树维护子树的
0
,
1
0,1
0,1 数量以及每个点的祖先链的
0
,
1
0,1
0,1 数量
*F:像数位 dp 那样依次枚举前
i
i
i 位压线,后面是个组合排列问题,用整数拆分压状态
I:贪心
ABGHJK:
2020 Multi-University Training Contest 4
BD:队友说是沙雕题
^*C:dp,设
f
i
,
j
f_{i,j}
fi,j 表示考虑了
i
i
i 个数,两个班重量差为
j
j
j,的最大 beauty 值。将数组随机打乱,限制
j
∈
[
−
1
0
5
,
1
0
5
]
j \in [-10^5,10^5]
j∈[−105,105]
E:求出每个相邻对是否能换位,然后随便 dp 一下
G:左边一排点表示
x
+
t
x+t
x+t 的值,右边一排点表示
x
−
t
x-t
x−t 的值,一个人代表一条连边,
n
−
最
大
匹
配
n-最大匹配
n−最大匹配 即为答案。dinic 冲过去
*I:考虑每条边的贡献,把
min
\min
min 拆掉是个组合数式子,预处理一些递推就能算了
看大题解
^K:引力太小可以忽略,物体几乎不动,直接输出初始距离
AFHJL:
2020 Multi-University Training Contest 5
A:
a
b
c
=
h
⋅
S
△
A
B
C
abc=h \cdot S_{\triangle ABC}
abc=h⋅S△ABC,最后推出
1
h
2
=
1
a
2
+
1
b
2
+
1
c
2
\frac{1}{h^2} = \frac{1}{a^2}+\frac{1}{b^2}+\frac{1}{c^2}
h21=a21+b21+c21
C:大模拟
*E:把
i
i
i 连向
a
i
a_i
ai 可得环套树森林,
k
=
0
k=0
k=0 答案为
0
0
0,
k
=
1
k=1
k=1 答案为
E
(
n
−
环
套
树
数
量
)
E(n-环套树数量)
E(n−环套树数量),
k
=
2
k=2
k=2 答案为
E
(
n
−
环
套
树
数
量
+
叶
子
数
量
)
E(n-环套树数量+叶子数量)
E(n−环套树数量+叶子数量)。
E
(
环
套
树
数
量
)
E(环套树数量)
E(环套树数量) 用 EGF 推一推,
E
(
叶
子
数
量
)
=
n
(
n
−
1
)
n
n
n
E(叶子数量)=\frac{n(n-1)^n}{n^n}
E(叶子数量)=nnn(n−1)n
G:树形 dp
*H:dp,每有一个数要当作某次删除的最小数时,可以视作新增一个大小为
k
k
k 的篮子,最终要把篮子填满。设
f
i
,
j
f_{i,j}
fi,j 表示当前到了第
i
i
i 个数,篮子总共还有
j
j
j 个空位,的方案数。转移就枚举当前数是当作最小数,还是填篮子,还是不选。
I:最终折痕形成的每个小格子都被划了十字,因此纸片数
=
(
2
横
折
次
数
+
1
)
(
2
竖
折
次
数
+
1
)
=(2^{横折次数}+1)(2^{竖折次数}+1)
=(2横折次数+1)(2竖折次数+1)
K:二分 + 2sat 判断 + 线段树优化连边
L:前
⌊
n
2
⌋
\lfloor\frac n2 \rfloor
⌊2n⌋ 个答案为
0
0
0,对于第
i
i
i 个数存活的方案数,考虑后面
n
−
i
n-i
n−i 个人连向前面的谁,因此方案数为
(
i
−
1
)
!
(
i
−
1
−
n
+
i
)
!
(
i
−
1
−
n
+
i
−
1
)
!
!
\frac{(i-1)!}{(i-1-n+i)!}(i-1-n+i-1)!!
(i−1−n+i)!(i−1)!(i−1−n+i−1)!!
BJM:
2020 Multi-University Training Contest 6
ABK:队友说是沙雕题
C:先归一化到均值为 0,设
f
x
f_x
fx 表示正数的和为
x
x
x 时的期望步数,分“两正一负”和“一正两负”讨论递推
E:方法一:设
d
p
s
u
m
,
x
,
y
dp_{sum,x,y}
dpsum,x,y 表示选出了一个区间得到值为
s
u
m
sum
sum,区间左端点
m
o
d
10
=
x
\bmod 10=x
mod10=x,区间右端点
m
o
d
10
=
y
\bmod 10=y
mod10=y,的最小代价。打表
方法二:打表发现答案 13 以内,于是可以做得更暴力
F:保留 MST 的边即可
G:莫比乌斯反演一套打下去
*H:
k
<
n
k <\sqrt n
k<n 的时候仿照 min25 进行 dp(设
f
i
,
j
f_{i,j}
fi,j 表示考虑了前
i
i
i 个质数、除去这些质数的贡献后这个数最大只能是
j
j
j,的方案数,这个是
O
(
n
3
4
log
n
)
O(\frac{n^{\frac 34}}{\log n})
O(lognn43) 的);
k
>
n
k>\sqrt n
k>n 的时候即要去掉含
>
n
>\sqrt n
>n 质因子的数,分块+min25 求素数个数
I:
a
n
s
=
[
(
b
−
1
)
m
o
d
x
=
0
]
ans=[(b-1) \bmod x=0]
ans=[(b−1)modx=0]
J:每一位单独考虑,是个矩阵树定理
D:
2020 Multi-University Training Contest 7
D:
G:对于当前点集,找出所有可能成为最远点对的点,把它们叫第一层,删掉,递归下去。先手必胜当且仅当起点不在最后一层或最后一层大小
>
1
>1
>1
**H:解法一:子集卷积,按最高位从小到大做子集卷积,以避免重复
解法二:子集卷积
e
x
p
exp
exp
I:划分成
x
x
x 个组,每个组至多
y
y
y 个元素,且递减排列。那么显然贪心地塞满后面的组,前面的组尽量放单个元素
*J:若走到主对角线或坐标轴则能走到无限远,此时答案为
0
0
0;否则可行区域是有限的(上下左右会被素数夹住),答案为
起
点
度
数
连
通
块
内
所
有
点
的
度
数
和
\frac{起点度数}{连通块内所有点的度数和}
连通块内所有点的度数和起点度数,其中度数包括连向自己的那条边
ABCEFK:
2020 Multi-University Training Contest 8
C:略
B:dp,设
f
i
f_i
fi 表示前
i
i
i 个数划分的答案。
i
i
i 每向右移动一位,只有
O
(
1
)
O(1)
O(1) 种前缀和的转移发生了变化。前缀和的每个位置维护一个单调队列,基于这个再用线段树或堆实现前缀后缀最大值。
D:tow pointers + LCT 求出每个左端点最右能到哪里使得这个区间内没有环
F:老 flappy bird 了 从左到右+从右到左即可求出合法区间
*G:假题害人 设
g
i
g_i
gi 表示游戏在
i
i
i 轮之内结束的概率,这等价于选
i
i
i 个数使得它们互质的概率,莫比乌斯容斥算出来。算出
g
i
g_i
gi 之后类似差分一下,就算出恰好
i
i
i 轮结束的概率,取偶数下标的和就是答案
*H:从外往里一圈一圈绕进去,参考题解的图
*I:枚举
k
k
k,
O
(
k
)
O(k)
O(k) 的时间算出
s
1
s_1
s1 的所有循环同构的哈希,然后看后面每个子串的哈希是否合法
*K:
x
⊕
y
∈
B
⟺
x
⊕
B
=
y
⊕
B
x \oplus y \in B \iff x \oplus B = y \oplus B
x⊕y∈B⟺x⊕B=y⊕B,因此两个数组每个元素都异或掉线性基,然后哈希或者 kmp
*L:每个点产生代价当且仅当它跟父亲最后权值不相同。dp,设
f
i
,
[
l
,
r
]
f_{i,[l,r]}
fi,[l,r] 表示
i
i
i 这个点取值在
[
l
,
r
]
[l,r]
[l,r] 这个区间的时候的最小代价,本质不同的区间只有
O
(
n
)
O(n)
O(n) 个。
AEJ:
2020 Multi-University Training Contest 9
A:新加的边终点肯定是根节点最优
*C:先推博弈得到形如
(
a
i
,
b
i
)
(a_i,b_i)
(ai,bi) 的必败态对的规律,然后 betty 定理算出
a
i
,
b
i
a_i,b_i
ai,bi 关于
i
i
i 的式子 为啥全世界都会啊
E:
G:平衡树
BDFHIJ:
2020 Multi-University Training Contest 10
CDG:队友说是沙雕题
*E:dp,设
f
i
,
j
f_{i,j}
fi,j 表示
i
i
i 这棵子树,根到叶子距离不超过
j
j
j,的最小代价。长链剖分优化
I:PCA,维护一些必要的信息以快速计算
^J:去掉的两个格子必然属于两行两列,剩下的一行一列每个格子拿空即输,也就是剩
1
1
1 就赢,也就是
a
i
j
−
1
a_{ij}-1
aij−1 的 nim 堆;与去掉的两个格子同行同列的其他格子则是普通 nim 堆,因此这些格子异或起来判断是否为 0
K:按
t
t
t 降序排列,注意
k
=
0
k=0
k=0 时不用排序
ABFH:
2021“MINIEYE杯”中国大学生算法设计超级联赛(1)
中超好耶
AE:队友说是沙雕题
*B:题解解法:kd tree
考场解法:大力猜时间复杂度是
O
(
n
2
/
20
)
O(n^2/20)
O(n2/20),因此把平面分成
80
×
80
80\times80
80×80 个小格,每画一个圆,格子就分为完全在圆内、完全在圆外、与圆有交 这三种情况,只用对于最后一种情况枚举小格内的所有点,这个面积占
4
∗
80
/
80
∗
80
≈
1
/
20
4*80/80*80\approx1/20
4∗80/80∗80≈1/20
*C:解法一:每条边设一个变元,高斯消元
未尝试的解法:插头 DP,轮廓线上每个顶点用 0/1 表示它是不是线的端点,那么一条轮廓线上一定是相邻的两个 1 配对。
F:求出异或前缀和
s
s
s,枚举右端点,左端点的
s
s
s 建 trie,维护子树的最大左端点,在 trie 上每次只用往一个方向走
*G:设
f
t
f_t
ft 表示
t
t
t 时刻传回自己的方案,那么
f
t
=
(
n
−
1
)
t
−
1
−
f
t
−
1
f_t=(n-1)^{t-1}-f_{t-1}
ft=(n−1)t−1−ft−1,通项是等比数列求和,最后解离散对数
H:枚举上边界,可以知道每列往下延伸到哪里,然后左起右起单调栈
I:MST
*J:解法一:莫队+值域分块,
O
(
m
n
)
O(m \sqrt n)
O(mn)
解法二:cdq
K:burnside 引理,每个不动点写出来的式子可以直接暴力,复杂度
O
(
k
ln
k
)
O(k \ln k)
O(klnk)
D:
2021“MINIEYE杯”中国大学生算法设计超级联赛(2)
签了一小时到,抬头一看 pku 差一题 AK
AE:队友说是沙雕题
B:对于链来说,在
x
x
x 位置开始加一个二次函数,对
y
y
y 的影响是
(
y
−
x
)
2
(y-x)^2
(y−x)2,拆开来,每个位置维护修改的 0、1、2 次方和。
D:每个询问拆成 trie 树上的
log
c
\log c
logc 次询问,转化成二维数点
*G:解法一:每个位置维护六元向量
(
a
,
b
,
a
2
,
b
2
,
a
b
,
1
)
(a,b,a^2,b^2,ab,1)
(a,b,a2,b2,ab,1),线段树维护矩阵乘法
H:先每科预处理
g
i
g_i
gi 表示这科考
i
i
i 分要多少天,然后再 dp 合并
*J:排列逆序对奇偶性
s
i
g
n
sign
sign 的式子列出来得到
a
p
−
1
2
a^{\frac{p-1}{2}}
a2p−1
看大题解
*K:高维前缀和
L:贪心
CFI:
2021“MINIEYE杯”中国大学生算法设计超级联赛(3)
1003:每种符号做一次 FFT
1004:每次使得互相平行的直线数量最少即可,按斜率分类,倒着做,每次删掉 size 多大的一类的一条线段
1007 1011:队友说是沙雕题
*1010:考场解法:大胆猜测具有
k
k
k 条折扣边的 MST 是具有
k
−
1
k-1
k−1 条折扣边的 MST 替换一条边而得来的,这也导致有用的边只有原始 MST 和折扣 MST 这
2
(
n
−
1
)
2(n-1)
2(n−1) 条,因此每次暴力找最优替换并重构 MST 即可
题解解法:有用边只有原始 MST 和折扣 MST 这
2
(
n
−
1
)
2(n-1)
2(n−1) 条,设
f
(
k
)
f(k)
f(k) 是具有
k
k
k 条折扣边的最优答案,则
f
(
k
)
f(k)
f(k) 是凸的,类似于 wqs 二分
1001 1002 1005 1006 1008 1009 1012:
2021“MINIEYE杯”中国大学生算法设计超级联赛(4)
1001:非 0 即发散
1002:略
1004:二分答案,然后使用任意一种后缀数据结构 check 即可
*1005:HNOI2016 序列 每个区间先找出最大值,然后左右两边
O
(
1
)
O(1)
O(1) 求,最小值同理
看大题解
*1007:cdq,分治区间里的数从小到大排序,左半和右半各维护一个单调栈
看大题解
1008:障碍点使得有障碍的行被分为总共
O
(
k
)
O(k)
O(k) 段空白段,依据空白段来维护可达段
1009:字母和数字一定只有 1 个连通块,因此从右往左,去掉 6 个连通块以后就是汉字了
1003 1006 1010 1011:
2021“MINIEYE杯”中国大学生算法设计超级联赛(6)
A:长度只能为
1
,
2
,
p
,
2
p
1,2,p,2p
1,2,p,2p,讨论一下
D:2021 bytecamp day2 对于
1
∼
n
−
1
1\sim n-1
1∼n−1 节点用旋转法构造
n
−
2
2
\frac{n-2}{2}
2n−2 条不相交的长度为
n
−
1
n-1
n−1 的哈密顿路径,用
n
n
n 号点把它们连起来
E:队友说是沙雕题
*G:观察数字对应的颜色,每次交换会使两个数字的颜色反色(相邻无关),因此如果有奇环就只与各颜色的奇偶性有关,否则是二分图,需要每个数字每侧的颜色数量完全相等
BCFHIJK:
CCPC Wannafly Camp 2020
Day1 - Rikka Contest
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:大模拟,卡常
Day2 - Legilimens Contest
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。
Day 6
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:两两乘起来
Day 7
H:略
A:正难则反,算不得分的数对
G:该矩阵一定存在哈密顿回路,因此
k
≥
n
m
k \geq nm
k≥nm 时一定可以遍历完整个地图,
k
<
12
k<12
k<12 时暴力
J:相邻两项之间会对
j
j
j 产生一个上界和下界的限制。于是枚举开头,二分最远的结尾