还是太长了,第二次分裂。。
标 * 的为有价值的题,标 ^ 的为欺诈题,标 - 的为知识点待填坑,标 ? 的表示看别人是这样做的但是没懂为什么
组队训练的题,如果是队友过的板刷题,题面又很长,就会标个“队友说是沙雕题”
Codeforces ( 主要是 gym )
300iq Contest 1
每天起床第一句,300iq TXDE!
*A:每个“*”拆成两个点并相连,一个连上下的“.”,一个连左右的“.”;每个“+”拆成两个点并相连,分别连上下左右的“.”,一般图最大匹配。20000 都敢跑带花树,时代变了
*B:二分答案
m
i
d
mid
mid,小于等于
⌊
m
i
d
2
⌋
\lfloor \frac{mid}{2} \rfloor
⌊2mid⌋ 的全部选上,任意两个选了的点之间最多再选一个点
*C:
a
a
a 数组先铺成
0
∼
n
−
1
0 \sim n-1
0∼n−1,然后
b
b
b 数组二分一个 rank,比他大的全是
n
n
n,比他小的全是
−
n
-n
−n
*D:从左到右贪心,维护一个 set 表示这里面的点全都放得下当前区间
F:使白边连成森林即可
*H:左边每个点
i
i
i 连右边一个前缀
1
,
⋯
,
a
i
1,\cdots,a_i
1,⋯,ai,按
a
i
a_i
ai 从小到大排序,可以覆盖所有的
k
k
k。dp 或贪心
看大题解
**K:每个串可以转化成一个唯一的长度 4 以内的基本串,基本串只有 12 种,矩阵乘法求出每种基本串在长度为
x
x
x 时有多少种对应的字符串
看大题解
EGIJ:
Bubble Cup 12
D:每个环有 size 那么多种方案,加起来形成一个式子,然后很多个式子做 FWT
E:解法一:暴力卡常冲过去
解法二:分治 FFT
F:队友说是沙雕题
H:树上的点随便做,环上的点推推式子发现是在距离
m
m
m 以内寻找有多少个点的点权是给定值,大力主席树
I:只有“第一列”选或不选两种情况
300iq Contest 2
每天起床第一句,300iq TXDE!
B:解法一:设
x
x
x 的最高位为
w
w
w,所有数按高
60
−
w
60-w
60−w 位分类,每一类最多选两个数,建个 trie 平行遍历
解法二:所有数排序,则只需保证相邻的异或值
≥
x
\geq x
≥x 即可,dp
I:先找出重心,然后选择若干儿子使其
s
i
z
e
size
size 之和
∈
[
n
4
,
3
n
4
]
\in [\frac n4,\frac{3n}4]
∈[4n,43n](必定存在),然后询问,就可以分治下去了,询问次数之和为
log
4
3
n
\log_{\frac 43} n
log34n
2019-2020 Russia Team Open, High School Programming Contest (VKOSHP 19)
AFI:队友说是沙雕题
B:
a
a
a 线段的端点沿
v
⃗
\vec{v}
v 投影到
b
b
b 线段上
C:计算出每一项的
(
a
,
b
,
c
,
n
)
(a,b,c,n)
(a,b,c,n),上 python 自带高精度判断是大于号还是小于号
*D:如果
(
1
,
1
)
→
(
1
,
m
2
)
→
(
n
,
m
2
)
→
(
n
,
m
)
(1,1) \to (1,\frac m2) \to (n,\frac m2) \to (n,m)
(1,1)→(1,2m)→(n,2m)→(n,m),那么中线一定有一个点被经过,这样就可以划分成两个部分平行递归下去了
G:相邻的减号之间最多插入一个括号,这样就可以 dp 了
H:从低位到高位一位一位构造,然后把多余的位清掉
*L:
x
x
x 到
y
y
y 经过
c
c
c 等价于
d
i
s
x
,
y
=
d
i
s
x
,
c
+
d
i
s
c
,
y
dis_{x,y}=dis_{x,c}+dis_{c,y}
disx,y=disx,c+disc,y,
k
k
k 棵树都有
x
x
x 到
y
y
y 经过
c
c
c 等价于
∑
d
i
s
x
,
y
=
∑
d
i
s
x
,
c
+
∑
d
i
s
c
,
y
\sum dis_{x,y}=\sum dis_{x,c}+\sum dis_{c,y}
∑disx,y=∑disx,c+∑disc,y。
O
(
n
2
k
)
O(n^2k)
O(n2k) 预处理距离,然后
O
(
n
3
)
O(n^3)
O(n3) 枚举
看大题解
2020 UP ACM Algolympics Final Round
D:略
EK:队友说是沙雕题
A:类似于最长公共子序列的 dp
B:bfs
C:拉格朗日条件极值
L:用拉格朗日插值公式
FGHIJM:
MEX Foundation Contest (supported by AIM Tech)
FI:略
**C:动态点分求重心
*E:
∑
e
min
{
c
e
x
,
c
e
y
}
=
∑
k
=
0
s
∑
e
[
c
e
x
≥
k
∧
c
e
y
≥
k
]
\sum_e \min\{c_{e_x},c_{e_y}\}=\sum_{k=0}^s\sum_e[c_{e_x} \ge k \land c_{e_y} \ge k]
∑emin{cex,cey}=∑k=0s∑e[cex≥k∧cey≥k],于是状压 dp,设
f
s
,
i
f_{s,i}
fs,i 表示已经分配了
i
i
i 个 token,
s
s
s 这个集合还继续参与分配,的最优答案。
*G:状压 dp,对于一个集合
s
s
s,假设它染红色,那么必存在一个结点,所有包含它的子集都是红色,于是
s
s
s 去掉这个结点就成了子问题了
*H:二分,
0
∼
m
i
d
−
1
0 \sim mid-1
0∼mid−1 每种权值的边至少选一条,选出来的边必须互相具有拓扑关系,这就成了个 2-sat。把 2-sat 写成暴力 dfs 也是能过的
ABDJ:
2018-2019 CTU Open Contest
AC:略
B:队友说是沙雕题
D:AC 自动机解方程
E:建 SA,每个位置由其前
k
k
k 个位置的最小
r
a
n
k
rank
rank 来覆盖
F:数位 dp
G:dp,设
f
a
,
b
,
c
,
d
f_{a,b,c,d}
fa,b,c,d 表示先手在
(
a
,
b
)
(a,b)
(a,b),后手在
(
c
,
d
)
(c,d)
(c,d),先手胜的概率。无视循环转移迭代 1000 次
H:SG 随便搞搞
*I:“不能重叠”等价于“总面积最小”,每次取最左下角的点,用这个点取一个最小正方形
J:按位考虑,每一位相当于数每个连通块的点数
Radewoosh+mnbvmar Contest
A:shuffle 一个区间就是把这个区间所有数变成平均值
*C:二分,第一次找中间竖线的最大值,然后往周围最大的方向走,第二次找横线最大值,依此类推
E:精细地实现
O
(
k
2
n
2
)
O(k^2n^2)
O(k2n2) 的 dp,在数据随机的情况下复杂度会变成
O
(
k
2
n
+
k
n
2
)
O(k^2n+kn^2)
O(k2n+kn2)
G:“010”和“101”会把序列割成若干段,预处理
S
G
l
e
n
,
s
SG_{len,s}
SGlen,s 表示长度为
l
e
n
len
len、序列状压为
s
s
s(记 111 为
1
1
1,110 为
0
0
0)的序列的
S
G
SG
SG 值
H:Dijkstra 的顺序倒着 dp,更新别人 dp 值可以
O
(
1
)
O(1)
O(1) 实现
J:有解的充要条件是存在两个形如“左下-右上”的结构,且一个能到达另一个
*-K:解法一:LCT+SAM
解法二:依据 border 划分成
log
\log
log 个等差数列
2018-2019 Summer Petrozavodsk Camp, Oleksandr Kulkov Contest 2
(以下题号按 statement 来标,但 statement 里的 GHI 对应 codeforces 上的 HIJ)
*B:枚举
gcd
\gcd
gcd,将
b
b
b 排序,二分答案,枚举
a
i
a_i
ai,相当于问
b
b
b 的一段前缀是否有
gcd
(
i
,
j
)
=
1
\gcd(i,j)=1
gcd(i,j)=1,简单反演一下,
O
(
n
log
3
n
)
O(n \log^3 n)
O(nlog3n)
C:贪心,每次没钱了就找前面最花钱的项目删除
?D:
N
≥
799039879
N \ge 799039879
N≥799039879 答案就是
2
N
−
799039877
2^{N-799039877}
2N−799039877,然后
<
799039879
<799039879
<799039879 就分段打表
*E:这是五边形数公式里让
x
=
0.1
x=0.1
x=0.1
G:(队友做的物理题我物理不及格就不插手了)
*I:对于当前的根
r
o
o
t
root
root,它的若干儿子
x
1
,
⋯
,
x
m
x_1,\cdots,x_m
x1,⋯,xm 同构,那么就构造
m
−
1
m-1
m−1 个置换表示子树
x
1
x_1
x1 与子树
x
2
x_2
x2 互换、子树
x
1
x_1
x1 与子树
x
3
x_3
x3 互换……,然后递归
x
1
x_1
x1 换根
ADFH:
2018-2019 9th BSUIR Open Programming Championship. Semifinal
AF:队友说是沙雕题
B:2-sat
*C:dp,设
f
i
,
j
,
k
f_{i,j,k}
fi,j,k 表示第
i
i
i 个数到第
j
j
j 个数考虑后
k
k
k 位,的贡献和。(可能还要再加一维表示当前这位选到了什么数)
E:比较麻烦的讨论题,可以枚举第一个数字的位数,注意判断
1
0
18
10^{18}
1018
^G:
n
≥
31
n \ge 31
n≥31 之后循环节为
4
4
4
H:
1
0
18
10^{18}
1018 范围内只要不含
1
,
2
,
3
,
5
,
8
1,2,3,5,8
1,2,3,5,8 就行
*I:每个左端点往有
O
(
log
)
O(\log)
O(log) 段,每个右端点往左也是,线段树随便搞搞
J:每个人 21 种状态,枚举第一个人是什么状态
K:算每条边的贡献,树链剖分,线段树暴力
*L:枚举最大和
s
u
m
sum
sum,那么
2
n
2n
2n 有
s
u
m
−
2
n
sum-2n
sum−2n 种选择,
2
n
−
1
2n-1
2n−1 除去
2
n
2n
2n 选掉的后还是
s
u
m
−
2
n
sum-2n
sum−2n 种选择……往下一段都是
s
u
m
−
2
n
sum-2n
sum−2n 种选择,这部分贡献是
[
x
]
∏
(
(
s
u
m
−
2
n
−
1
)
+
x
)
[x]\prod \big((sum-2n-1)+x\big)
[x]∏((sum−2n−1)+x),剩下的贡献就阶乘除一除
D:
2018-2019 9th BSUIR Open Programming Championship. Final
H:略
A:区间 dp,设
f
l
,
r
f_{l,r}
fl,r 表示区间
[
l
,
r
]
[l,r]
[l,r] 的答案,如果两头都是字母那么就是
f
l
+
1
,
r
−
1
f_{l+1,r-1}
fl+1,r−1,否则枚举星号匹配了多少长度
*C:答案一定是 2 的幂,枚举答案(最多
log
\log
log 次),算出最终矩阵并判断
看大题解
D:牌从小到大排序然后 dp
E:FWT
F:枚举两个二进制位算贡献(注意常数,不要在
O
(
n
log
2
a
)
O(n \log ^2 a)
O(nlog2a) 的循环里取模)
I:记忆化搜索
*J:分块,预处理块内答案和任意两块之间的答案
BGK:
2019-2020 Saint-Petersburg Open High School Programming Contest (SpbKOSHP 19)
ABCH:队友说是沙雕题
*E:考虑把
n
n
n 个数当成
n
n
n 个二进制位,
+
1
+1
+1 放正数,
−
1
-1
−1 放负数,
0
0
0 的位放最前面
F:floyd 或者大讨论
G:meet in the middle
I:
n
>
4
n>4
n>4 时三元组之间会连成一个环,直接把这个环做出来
*J:递推,每次对于一个排列,找到最大值的位置,把它前面的元素放后面,删掉最大值,这就递归下去了,推一推转移式子
K:奇偶分组,每组用 LCT 解决
D:
2017-2018 8th BSUIR Open Programming Contest. Final
EH:队友说是沙雕题
B:暴力
C:对于左边更大和右边更大两种情况分别二分
*F:先对于所有 01 串(
0
0
0 表示小数,
1
1
1 表示大数)过一次排序网络看看合不合法,再根据合法的 01 串 dp 出合法的排列数量
G:
1
+
l
c
m
(
n
−
1
,
m
−
1
)
−
(
重
复
经
过
的
格
子
数
)
1+lcm(n-1,m-1)-(重复经过的格子数)
1+lcm(n−1,m−1)−(重复经过的格子数),重复经过的格子数可以画一下图观察一下
H:
*I:扫描右端点,合法的左端点区间(有
1
1
1、不含重复数字)是滑窗向右的,树状数组维护桶
J:枚举首项以及
N
N
N 是第几项
ADK:
2017-2018 8th BSUIR Open Programming Contest. Semifinal
ABFHJ:略
K:队友说是沙雕题
C:维护线性基
*D:不考虑
L
L
L 连向第一排、
R
R
R 连向最后一排,那么合法的方案跟不合法的方案是成对存在的,直接总方案数除以
2
2
2
看大题解
E:每种质数单独考虑,随便 dp 一下
*G:等价于
∑
i
=
0
k
−
1
(
(
a
+
b
i
)
m
o
d
m
)
m
o
d
9
\sum_{i=0}^{k-1} ((a+bi) \bmod m) \bmod 9
∑i=0k−1((a+bi)modm)mod9,把
m
o
d
m
\bmod~m
mod m 拆成整除的形式然后类欧
看大题解
?I:
O
(
n
3
)
O(n^3)
O(n3) 枚举钝角三角形暴力判(钝角三角形的数量是有限的,只要精细地实现程序,使得每次枚举都是一个钝角三角形)
2016-2017 7th BSUIR Open Programming Contest. Final
A:队友说是沙雕题
B:第
i
i
i 行就放
[
(
i
−
1
)
n
+
1
,
i
n
]
[(i-1)n+1,in]
[(i−1)n+1,in] 就好了,保持每行的相对顺序一致、行内满足不相邻的条件即可
*C:SG 值是分段的,每次除以
2
2
2 或除以
9
9
9 得到上一段的左端点
E:GDOI2015粗心的邮差 状压 dp,设
f
i
,
s
f_{i,s}
fi,s 表示考虑了前
i
i
i 个数,第
i
i
i 个数前后
k
k
k 项是否被分配记为
s
s
s,的方案数。
k
k
k 小
n
n
n 大的时候用矩阵乘法
F:枚举一个 swap 的点,预处理其左右的最大子段,以及最大子段+剩余元素最大值
G:设从低位到高位考虑到了第
i
i
i 位(总共考虑
n
n
n 位),当前的数是
c
u
r
cur
cur,若
c
u
r
cur
cur 的第
i
i
i 位为
1
1
1,则放
1
1
1,否则放
2
2
2。
H:dp
I:
1
,
2
,
1
,
2
,
⋯
1,2,1,2,\cdots
1,2,1,2,⋯ 这样放,也就是考虑
s
m
o
d
3
s \bmod 3
smod3 就行了
DJ:
2015-2016 6th BSUIR Open Programming Contest. Final
DEH:队友说是沙雕题
A:数位 dp
C:每个数暴力枚举它跟前面共有什么质数
*F:解法一:圆方树+树形 dp 分类讨论圆点和方点
解法二:dfs树+树形 dp 特殊考虑返祖边
G:注意到只跟行、列各翻转了多少次有关,若
n
2
n^2
n2 较小,则暴力枚举行、列各翻转了多少次,否则
n
t
nt
nt 比较小,对每个询问枚举行翻了多少次
*I:最优一定是
4000
⋯
000
−
000
⋯
000
4000\cdots000-000\cdots000
4000⋯000−000⋯000,所以一开始扔个
4
4
4,收到
4
4
4 以后放
(
1
,
1
)
(1,1)
(1,1)
BJ:
2015-2016 6th BSUIR Open Programming Contest. Semifinal
EFI:略
BH:队友说是沙雕题
A:枚举
gcd
\gcd
gcd,把
b
i
b_i
bi 是它倍数的位置拉出来,求上升子序列数量,然后容斥
C:meet in the middle
^D:把它看成一个四位数,维护一个可选集合,每次从里面随机一个出来问
G:找规律
K:bzoj5016 拆成前缀询问,莫队
J:
2014-2015 V BSUIR Open Programming Championship
EF:队友说是沙雕题
*A:用
p
p
p 进制考虑,问题最后转化成:有
n
n
n 堆石子,我从一堆拿走一个后,对面要么再选择一堆拿一个,要么从后面的堆拿一个填上我的位置。结论是当石子总数为奇数时先手必胜
B:排序后暴力
C:不停地给
n
n
n 开根号
^D:有通式的,写个暴力就找到通式了,比如
2
,
3
,
4
,
5
,
7
,
6
,
8
,
9
,
10
,
13
,
12
,
11
2,3,4,5,7,6,8,9,10,13,12,11
2,3,4,5,7,6,8,9,10,13,12,11
G:树形dp
J:答案等于最小的
最
远
点
对
2
\frac{最远点对}{2}
2最远点对
K:dp,设
f
n
,
m
f_{n,m}
fn,m 表示还剩
n
n
n 红
m
m
m 黑的最大期望收益
HI:
2013-2014 BSUIR Open Programming Championship. Final
完结撒花
BD:队友说是沙雕题
A:这题的考点是如何不爆 long long。两者同号用减法,异号用加法。(当然 0202 年了直接 __int128 或者 python 完事了)
C:SA 随便搞搞
F:每个数按最低位分类,每一类从大到小贪心,注意特殊考虑
0
0
0
H:直接从左到右贪心
I:有一点点繁琐的树形 dp
J:枚举
1
1
1 的个数,然后数位 dp
K:推式子,枚举
X
X
X 算答案
E:
AGM 2020, Final Round, Day 1
D:队友说是沙雕题
*B:扫描右端点,维护左端点的答案,用单调栈维护最值,用线段树维护最小值的异或和、最大值的异或和、最小值
∨
\lor
∨ 最大值的异或和
E:扫描线
F:贪心模拟最小割
H:
n
,
m
,
k
n,m,k
n,m,k 恰有一个是奇数的时候,只有一个格子走不到,否则全都走得到
I:最大获利
*K:圆邻域当成方邻域来做,邻居数量是同阶的。剩下的就是个简单 MST
ACGJL:
AGM 2020, Final Round, Day 2
CDHJ:队友说是沙雕题
A:最长反链=最小链覆盖,传递闭包+二分图最大匹配
*E:点分 FFT 求出每种长度的路径有多少,然后 FFT 算答案
G:启发式合并,或者 dsu on tree
I:广义圆方树+虚树 dp
BEKL:
AGM 2020, Qualification Round
CDI:队友说是沙雕题
A:网络流
B:贪心逐位确定,每次相当于问以
x
x
x 为根
y
y
y 子树的大小
E:注意到
a
i
a_i
ai 很小,枚举
a
i
a_i
ai 和
a
j
a_j
aj 的值,然后让两数的差的绝对值尽量小
^F:每次排序长度为 2 是最优的,因此等价于求逆序对
G:250 行的打牌题
H:按
e
i
e_i
ei 从小到大排序,设
s
i
s_i
si 表示吃到第
i
i
i 颗糖所需要吃掉的集合,则
s
i
=
s
i
−
1
∪
{
i
的
后
继
}
s_i=s_{i-1}\cup\{i的后继\}
si=si−1∪{i的后继},最后
∀
i
,
e
i
≥
∣
s
i
∣
\forall i, e_i \ge |s_i|
∀i,ei≥∣si∣ 即表示合法。因此每个点会从他前驱中最小的
e
i
e_i
ei 开始做贡献,反向图拓扑+扫描线
J:维护
O
(
n
2
)
O(n^2)
O(n2) 个线段树
K:dominator tree 模板题
-L:top tree
2019 USP Try-outs
BH:略
FG:队友说是沙雕题
*A:分成
m
>
5
⋅
1
0
4
m>\sqrt{5 \cdot 10^4}
m>5⋅104、
m
≤
5
⋅
1
0
4
m \le \sqrt{5 \cdot 10^4}
m≤5⋅104 两类
*C:用 set 维护当前的集合,每次询问
i
d
id
id,从最小的元素开始贪心选尽可能多的能装在
i
d
id
id 里的,然后再从
i
d
id
id 往后贪心选尽可能多的
-D:treap
I:以
b
b
b 为第一关键字、
a
−
b
a-b
a−b 为第二关键字从小到大排序,是最优的
J:最小圆覆盖
K:从小到大排序,若发现存在某个位置
x
x
x 使得
∑
i
=
1
x
p
i
<
p
x
+
1
−
1
\sum_{i=1}^x p_i<p_{x+1}-1
∑i=1xpi<px+1−1,那么答案就是
(
∑
i
=
1
x
p
i
)
+
1
\big(\sum_{i=1}^x p_i\big)+1
(∑i=1xpi)+1
E:
2020 Petrozavodsk Winter Camp, Jagiellonian U Contest
L:略
FG:队友说是沙雕题
*A:2020牛客多校第四场 H 去掉
>
n
2
> \frac n2
>2n 的质数和
1
1
1 之后,剩下的数必能两两匹配或剩一个,因此就是求
(
n
2
,
n
]
(\frac n2,n]
(2n,n] 的质数个数
B:Lucas 定理简单应用
*H:每次还能到达的可行域是一个区间,dp 设
f
l
,
r
,
0
/
1
f_{l,r,0/1}
fl,r,0/1 表示当前能到达的区间是
[
l
,
r
]
[l,r]
[l,r],当前在
l
l
l 还是在
r
r
r,的最长距离。把
[
1
,
n
]
[1,n]
[1,n] 倍长以后再 dp 可以避免枚举起点
I:每次贪心构造一个尽量匹配高位的、小于等于当前数里最大的,例如
3450255
3450255
3450255 会构造出
3449443
3449443
3449443,这样理想情况下每次会把原数长度减半
K:容斥+插头 dp
CDEJ:
XXI Open Cup. Grand Prix of Korea
*A:最大流,转化成最小割,枚举两边割了多少点,两边的点肯定是从小到大割,推下式子用线段树维护
*D:假设有一个
m
i
d
mid
mid,大于等于
m
i
d
mid
mid 的边视为黑边,小于
m
i
d
mid
mid 的边视为白边,那么黑连通块必须全部成团,这样就知道了最终
≥
m
i
d
\ge mid
≥mid 的边的数量。从大到小枚举
m
i
d
mid
mid 并查集合并。
-*F:数轴的每个位置不能被超过两个区间覆盖,也等价于找两个内部不相交的子集使得价值和最大(类似于 menger 定理)。因此是个费用流,并且需要 potential method 优化
H:二分,
m
i
d
mid
mid 后面的全部变成
0
0
0,然后从小到大填空位
J:倒推预处理出路径上的每一步在
(
−
1
,
0
)
,
(
1
,
0
)
,
(
0
,
−
1
)
,
(
0
,
1
)
(-1,0),(1,0),(0,-1),(0,1)
(−1,0),(1,0),(0,−1),(0,1) 开始的话会在哪里结束
K:找一个点为起点,其他点极角排序,按顺序穿成菊花图
BCEGIL
BCPC 2020 Preliminary
ABCE:队友说是沙雕题
D:先算出最大题数,将
a
i
a_i
ai 从小到大排序,枚举一个前缀是用
a
i
a_i
ai 做题的,其余题是用
x
x
x 做题的
F:暴搜
-G:闵可夫斯基和+旋转卡壳
*H:最大就直接两边往中间选,最小相当于选择不相邻的
k
k
k 条线段,贪心
I:minmax容斥推式子
*K:FWT 算出区间异或(转化成前缀异或和)的方案数,再用 FWT 算出
A
−
B
=
A
∧
¬
B
A-B=A \land \lnot B
A−B=A∧¬B
L:树上莫队
JMN:
Samara Farewell Contest 2020 (XXI Open Cup, GP of Samara)
*A:
a
i
≤
k
,
b
i
≥
m
−
k
a_i\le k,\ b_i \ge m-k
ai≤k, bi≥m−k 的叫工作狂,如果没有工作狂那么答案为 0,否则以所有
a
i
−
1
,
b
i
a_i-1,\ b_i
ai−1, bi 为关键点,计算以每个关键点作为起始的工作时间,注意 corner case
^B:二分答案
m
i
d
mid
mid,每个 quest 的收益就是
max
(
b
−
a
⋅
m
i
d
,
d
−
c
⋅
m
i
d
)
\max(b-a \cdot mid,d-c \cdot mid)
max(b−a⋅mid,d−c⋅mid),看期望是正数还是负数来调整二分
*C:枚举行 shift,维护列 shift 的前缀并查集和后缀并查集(前缀并查集只用记录第一列的连通性,后缀并查集只用记录末尾列的连通性)
看大题解
D:按
a
i
a_i
ai 从大到小排序,简单 dp
E:按
z
z
z 排序,线段树维护每个
y
y
y 对应的最大
x
x
x,提神醒脑数据结构题
F:直接
O
(
4
n
)
O(4n)
O(4n) dp,一个点如果选就就必须转移到覆盖这个点的线段的最大末端,且不能跨过完整的线段,然后如果在某线段的末尾就一定要选
G:简单贪心
*H:从后往前分
a
n
<
m
a_n <m
an<m、
a
n
≥
m
a_n \ge m
an≥m 且
n
=
m
n=m
n=m、
a
n
≥
m
a_n \ge m
an≥m 且
n
>
m
n>m
n>m 三种情况倒推
看大题解
J:基本上是
max
(
a
i
−
b
i
+
1
)
\max(a_i-b_i+1)
max(ai−bi+1),注意讨论“因为种类只剩一种了所以我死了”的情况
K:回血前如果怕回爆了可以先去别的小怪消耗一下(不必直接打死),因此这等价于 2014 WF 的贪心题
L:dp,以
a
i
a_i
ai 为第一关键字、
i
i
i 为第二关键字的顺序 dp
M:大力旋根
IN:
2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus)
*D:设
d
p
i
dp_i
dpi 表示到了第
i
i
i 个数的最大答案,枚举
f
i
f_i
fi 跟上一个选的数的贡献的最高位,那么上一个选的数就是上一个这一位为
1
1
1 的数
*E:每一位单独考虑,如果删掉
0
0
0 段,那么合法意味着所有其他
0
0
0 段合法;如果删掉
1
1
1 段,那么不能存在最小覆盖次数
≥
2
\ge 2
≥2 的
0
0
0 段,且最小覆盖次数为
1
1
1 的
0
0
0 段的
1
1
1-覆盖的交集要包含这个
1
1
1 段
G:把完美匹配压缩起来,
n
2
\frac n2
2n 个点用 Cayley 定理
^I:无论如何交换牌,一轮结束之后答案都是不变的,因此答案等于初始局面的答案
J:一个点确定选不选之后,整个连通块都确定了,因此是连通块黑白染色取小的一边
M:
1
,
1
⋅
2
,
2
⋅
3
,
3
⋅
5
,
⋯
1,\ 1\cdot 2,\ 2 \cdot 3,\ 3\cdot 5,\cdots
1, 1⋅2, 2⋅3, 3⋅5,⋯ 这样,每次选的数字是模
6
6
6 为
1
,
2
,
3
,
5
1,2,3,5
1,2,3,5 循环的
N:笛卡尔树递归
ABCFHKL:
2020-2021 Winter Petrozavodsk Camp, Day 9 Contest (XXI Open Cup, Grand Prix of Suwon)
C:二分+扫描线
F:做出所有环的线性基(任意做生成树,非树边产生的环即可构成线性基),记
a
i
a_i
ai 表示
i
i
i 结点到生成树根的路径异或和,
a
i
′
a_i'
ai′ 为去除基元后的
a
i
a_i
ai,
M
A
X
MAX
MAX 为基元构成的最大值,那么只需求
⨁
l
≤
i
<
j
≤
r
a
i
′
⊕
a
j
′
⊕
M
A
X
\bigoplus_{l \le i < j \le r}a_i' \oplus a_j' \oplus MAX
⨁l≤i<j≤rai′⊕aj′⊕MAX
*G:区间 dp,设
d
p
l
,
r
dp_{l,r}
dpl,r 表示区间
[
l
,
r
]
[l,r]
[l,r] 的答案,枚举最大值所在位置
i
i
i 来转移,注意到当三元组
(
l
,
r
,
i
)
(l,r,i)
(l,r,i) 确定时,
i
i
i 位置的最优取值是唯一的。最优取值可以用斜率优化算出
I:记
k
k
k 为数列的连续单调段的数量,最优情况下每次
k
←
⌈
k
2
⌉
k \gets \lceil \frac k2 \rceil
k←⌈2k⌉
J:枚举
p
2
p_2
p2,二分
p
3
p_3
p3
ABDEHKL:
2020-2021 “Orz Panda” Cup Programming Contest
CEG:队友说是沙雕题
A:单调栈
*B:只看前两种覆盖,burnside引理+反演一套打下去,发现是特殊的斐波那契数列卷欧拉函数这也太卷了,分块+杜教筛+矩阵快速幂
D:一条边会贡献当且仅当上一次 access 这棵子树内的点,下一次 access 子树外的点,因此是
lim
m
→
∞
(
m
−
1
)
2
p
(
1
−
p
)
m
=
2
p
(
1
−
p
)
\lim_{m \to \infty} \frac{(m-1)2p(1-p)}{m}=2p(1-p)
limm→∞m(m−1)2p(1−p)=2p(1−p),其中
p
p
p 表示选子树内的点的概率
*F:看成电路模型,基尔霍夫方程
H:如果一开始就校验通过那就是 good;否则假设错了一位,看
d
(
2
i
)
d(2^i)
d(2i) 错了多少个,错 0 个那就是
d
(
0
)
d(0)
d(0) 错了,错 1 个那就是
d
(
2
i
)
d(2^i)
d(2i) 错了,错多个那就是
d
(
∨
2
i
)
d(\lor_{2^i})
d(∨2i) 错了,纠正后再校验,通过则是真的错 1 位,否则是 broken
I:叉积一圈
*J:从大到小放数字,容斥算每次方案数,式子形如
∑
i
=
0
x
∑
j
=
0
y
(
−
1
)
x
+
y
(
x
i
)
(
y
j
)
w
s
1
(
w
−
1
)
s
2
\sum_{i=0}^x \sum_{j=0}^y (-1)^{x+y} \binom{x}{i} \binom{y}{j} w^{s1}(w-1)^{s2}
∑i=0x∑j=0y(−1)x+y(ix)(jy)ws1(w−1)s2,枚举
i
i
i 快速算
2020-2021 ICPC Northwestern European Regional Programming Contest (NWERC 2020)
CK:略
*D:一颗一颗来,每次得到一个
c
2
c^2
c2,枚举
a
∈
[
1
,
1
0
6
]
a \in [1,10^6]
a∈[1,106],判断是否有
c
2
=
a
2
+
b
2
c^2=a^2+b^2
c2=a2+b2。稀疏得很
E:判断 Alice 胜是简单的 meet-in-the-middle,判断和棋只有在
n
n
n 很小时才需要暴力判,
n
n
n 大的时候一定有可以传送的地方,随机判断。
FH:队友说是沙雕题
*I:解法一:枚举两个人的出发点
x
,
y
x,y
x,y,每个点上都有两个区间是不能被第三个人用的,第三个人的起点从
x
x
x 枚举到
y
y
y 或者从
y
y
y 枚举到
x
x
x 都能快速地维护答案
解法二:预处理
b
i
,
j
b_{i,j}
bi,j 表示两个人从
i
,
j
i,j
i,j 出发会不会撞,然后
O
(
n
3
)
O(n^3)
O(n3) 枚举起始位置直接判断
*J:做 dfs 树,dfs 过程中会把点分成 栈内点、已遍历点、未遍历点 三部分,一定存在一个时刻使得已遍历点的数量等于未遍历点的数量,此时栈内点就是所求路径
ABG:
2020-2021 ICPC Southeastern European Regional Programming Contest (SEERC 2020)
*^B:
∑
(
1
的
位
置
)
−
∑
(
0
的
位
置
)
\sum(1的位置)-\sum(0的位置)
∑(1的位置)−∑(0的位置),reverse 01 使得这个值减 2,其余操作使得这个值减 4
D:每次选一个在柱顶的颜色,已知该颜色一个珠子在柱顶,讨论另外两个珠子的位置,都可以 6 步以内完成
E:队友说是沙雕题
*F:最后一定是变成若干个同色连续段,且颜色的顺序会遵循原序列的顺序。设
d
p
i
,
j
dp_{i,j}
dpi,j 表示考虑了前
i
i
i 个数,第
i
i
i 个数染了
j
j
j 色,的方案数
**H:每个询问考虑最后答案二进制有几个 1,比它少的都要 or,比它大的都要 and,跟它一样多的必须全部相等,然后要么全都丢到同一边,要么两边都丢。用主席树预处理对于每个
x
∈
[
0
,
30
]
x \in [0,30]
x∈[0,30],只考虑 1 的数量等于
x
x
x 的
a
i
a_i
ai 的区间和、或、数量
看大题解
*I:强制让 1 放开头并忽略,那么 2 的位置会把排列分成两个下降序列。设
d
p
i
,
j
dp_{i,j}
dpi,j 表示把
3
,
⋯
,
i
3,\cdots,i
3,⋯,i 分成两个下降序列,其中一个开头是
i
i
i 另一个开头是
j
j
j,的方案数。
i
i
i 这一维可以扔掉
*L:按
p
+
m
p+m
p+m 从大到小排序,一定是前面的人抢,后面的人帮(
m
i
−
p
j
>
m
j
−
p
i
⇒
m
i
+
p
i
>
m
j
+
p
j
m_i-p_j>m_j-p_i \Rightarrow m_i+p_i>m_j+p_j
mi−pj>mj−pi⇒mi+pi>mj+pj),二分答案用堆维护
M:按 bfs 序贪心
ACGJK:
2020-2021 Winter Petrozavodsk Camp, UPC contest
A:转化成问恰好
k
k
k 个相邻对的排列的数量,设
d
p
i
,
j
,
0
/
1
dp_{i,j,0/1}
dpi,j,0/1 表示从小到大放到第
i
i
i 个数,有
j
j
j 个相邻对,
i
i
i 这个数是否跟
i
−
1
i-1
i−1 相邻,的方案数
C:队友说是沙雕题
E:大力莫队线段树
I:
b
b
b 序列减
a
a
a 序列得到每个人赢的局数,只要和大于
n
−
1
n-1
n−1 且第一个人有赢即可,特判
n
=
1
,
2
n=1,2
n=1,2
J:即
4
n
+
1
4n+1
4n+1 是完全平方数,只需令
n
=
x
2
+
x
n=x^2+x
n=x2+x 即可,即第
k
k
k 个合法的数是
k
2
+
k
k^2+k
k2+k
K:边双树求直径
L:解法一:约定任意两行的差不超过 3 格,这样就只有 27 种状态,大力推转移然后矩阵乘法
解法二:手推使得三行对齐的状态转移
BDFGH:
National Taiwan University NCPC Preliminary 2021
B:树形 dp
C:等价于找长度
>
5
>5
>5 的奇环
*D:解法一:把询问串也加进 trie 里建 AC 自动机,那么每次就是问一条链上有多少个节点在询问串的 fail 子树中,遍历 trie 维护祖先链的 fail 树 dfs 序+区间查询即可
解法二:trie 上建 sam
E:bitset 优化背包
*F:对于答案
a
n
s
ans
ans 来说,
a
<
a
n
s
a<ans
a<ans 时均有
(
a
x
m
o
d
p
+
a
y
m
o
d
p
)
−
(
a
(
x
+
y
)
m
o
d
p
)
=
p
(ax\bmod p+ay\bmod p)-(a(x+y)\bmod p)=p
(axmodp+aymodp)−(a(x+y)modp)=p,因此可以二分,用类欧来 check
*H:一个 rank 集可能比另一个 rank 集高分,当且仅当存在一个数
x
x
x,使得前一个 rank 集小于等于
x
x
x 的数量多于另一个 rank 集小于等于
x
x
x 的数量,因此可以做出朴素的
O
(
n
3
)
O(n^3)
O(n3) dp,用 NTT 优化转移
I:费用流,每条边
<
u
,
v
,
a
,
b
>
<u,v,a,b>
<u,v,a,b> 拆一个新点
x
x
x,连
<
v
,
x
,
1
,
0
>
,
<
x
,
u
,
1
,
a
>
,
<
x
,
T
,
1
,
b
>
<v,x,1,0>,<x,u,1,a>,<x,T,1,b>
<v,x,1,0>,<x,u,1,a>,<x,T,1,b>,源点连向入度超了的点,入度有盈余的连向汇点
J:简单状压
*K:考虑一个
a
i
a_i
ai 最多
x
x
x 步结束,操作一次以后变成最多
y
y
y 步结束,则
y
y
y 可以取小于
x
x
x 的任意数,因此
S
G
(
a
)
=
log
k
a
SG(a)=\log_k a
SG(a)=logka,对于每个
a
a
a 来说
k
k
k 的突变点只有
O
(
log
a
)
O(\log a)
O(loga) 个
AGL:
XXII Open Cup. Grand Prix of Korea
H:队友说是沙雕题
J:答案有两个部分:第一部分是本身不可能为周期的,枚举两个不同的
a
a
a 它们的间隔的约数都不可能为周期;第二部分是如果它为周期那么它的约数也是周期从而它本身不是最小周期,这样的周期最大只有
n
n
n,枚举判断即可
ABCDEFGIKLM:
Opentrain
Petrozavodsk Summer-2013. Moscow IPT Contest
E:略
*A:它是个分层图,每个点 hash 一个出点集,bfs 来定层,每个点的出点按照该 hash 值分为左右两边
C:大力余弦正弦推式子
*F:每列看成是连边,每个连通块如果没有奇环那么就是有一个自由变元,如果有奇环就没有自由变元,
r
a
n
k
=
n
−
rank=n-
rank=n−自由变元
I:按二进制
1
1
1 的数量的奇偶性分为两个集合,可证
k
<
n
k<n
k<n 时一定可行
*J:点分+FFT,注意常数
K:线段树维护
∑
a
\sum a
∑a、
∑
b
\sum b
∑b、
∑
a
⋅
b
\sum a\cdot b
∑a⋅b,以及
a
a
a 和
b
b
b 的加法标记
Petrozavodsk Winter-2014. Warsaw U Contest
BH:略
A:暴力 bitset,设
b
i
,
j
b_{i,j}
bi,j 表示第
i
i
i 位不是
j
j
j 的有谁
E:任一自然数能被不超过 3 个形如
n
(
n
+
1
)
2
\frac{n(n+1)}2
2n(n+1) 的数的和表示
*F:做法一:询问拆成 4 个二维前缀的形式,然后对 x 轴 cdq,时间
O
(
n
log
2
n
)
O(n \log^2 n)
O(nlog2n)
做法二:询问拆成 4 个二维前缀的形式,然后对于每个小询问,矩形只会有被全包含、踩上边界、踩右边界、踩右上顶点四种情况,最后一种最多只有一个矩形,其余三种可以简单维护,时间
O
(
n
log
n
)
O(n \log n)
O(nlogn)
*I:对于一棵树,每次贪心找
d
e
e
p
i
+
a
i
deep_i+a_i
deepi+ai 最大的点(因为这个是瓶颈),然后处理掉那棵子树
*J:每一个 N 开头的后缀都是一个独立的游戏(除了开头其他全是 S),比如 NSNNS,则看作是 NSSSS、NSS、NS 三个独立游戏,暴力算
S
G
SG
SG,时间
O
(
n
2
log
n
)
O(n^2 \log n)
O(n2logn)
Petrozavodsk Summer-2013. Gennady Korotkevich Contest 1
*A:解法一:SA,对于 SA 的每一项,出现次数向上找,那么:
h
e
i
g
h
t
height
height 以外的出现次数为
1
1
1,二分最大合法长度就行了;
h
e
i
g
h
t
height
height 以内的去掉被覆盖过的,总量是
O
(
n
)
O(n)
O(n) 的
解法二:SAM,每个节点的出现次数、长度区间都是在建树时维护好的,那么每个节点二分一个最长的合法长度就行了
B:枚举分界点
C:枚举加起来等于 10 的组合,然后
O
(
n
2
)
O(n^2)
O(n2) dp,注意末位 0 的情况
*E:解扩展 gcd 得到裴蜀系数,可以通过裴蜀系数来推答案的式子
G:要求的是最长的子序列使得拼起来后是排完序的数组中的连续一段。考虑排序后分成若干段相同的数,取 1 段则全取,取 2 段可以在原序列上
O
(
n
)
O(n)
O(n),取大于等于 3 段时中间的段是要全取完的
H:队友说是沙雕题
J:余数也是
n
n
n 的约数,因此直接枚举
n
n
n 的约数,假设是
d
d
d,则把
d
d
d 当作余数的贡献为
n
−
d
d
\frac{n-d}d
dn−d 的大于
1
1
1 的约数个数,暴力
XV Open Cup named after E.V. Pankratiev Grand Prix of Siberia
12:略
2:队友说是沙雕题
3:解法一:暴力枚举
k
k
k,双 hash 判(不知道为什么我们的单 hash 被卡掉了。。
4:FWT
5:分层最短路
7:棋盘黑白染色,跑最大流
8:搞个堆,一开始有
O
(
n
2
)
O(n^2)
O(n2) 条边在里面,每次合并两个集合之后往堆里加
O
(
n
)
O(n)
O(n) 条边,因此堆总量是
O
(
n
2
)
O(n^2)
O(n2) 的
*10:等角螺线公式+弧长积分
Petrozavodsk Winter Training Camp 2018 Day 2: ITMO U 1 Contest
*A:大力积分
C:先取
1
3
\frac 13
31,他剩下的这块
2
3
\frac 23
32 不动(假设先扔掉),然后大家都取对方最大的
2
3
\frac 23
32,最后我至少剩
1
9
\frac 19
91,再取他一开始那个
2
3
\frac 23
32 的
2
3
\frac 23
32 就够了
D:第
i
i
i 轮的贡献就是
(
n
−
k
2
i
−
1
−
1
)
(
2
n
−
1
2
i
−
1
−
1
)
\frac{\binom{n-k}{2^{i-1}-1}}{\binom{2^{n}-1}{2^{i-1}-1}}
(2i−1−12n−1)(2i−1−1n−k)
*E:题意坑 递推求答案,算
n
!
!
mod
2
64
n!!~\text{mod}~2^{64}
n!! mod 264 有科技。
看大题解
G:队友说是沙雕题
^H:考虑最终结构,
p
i
p_i
pi 向
p
j
p_j
pj 连边,会构成一棵树。因此逐位确定跑最小树形图就好了
**I:对于每个
i
i
i,给
a
i
a_{i}
ai 加上一个随机的
y
i
y_i
yi,给
a
p
i
a_{p_i}
api 减去
y
i
y_i
yi。然后读入的数组反过来,跟
a
a
a 数组做卷积,
0
0
0 就表示合法位置
看大题解
J:设
f
i
f_i
fi 表示方案数,
a
i
>
n
a_i > \sqrt n
ai>n 时直接跳着转移,
a
i
≤
n
a_i \leq \sqrt n
ai≤n 时按
i
mod
a
i
i~\text{mod}~a_i
i mod ai 维护一下,避免计重如果跳到相同的格子要停下来
XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Gomel
A:易证
a
×
h
=
n
a \times h=n
a×h=n
B:模型转化为有很多物品,第
i
i
i 种物品价格为
i
i
i,数量为
log
2
lowbit
(
i
)
+
1
\log_2\text{lowbit}(i)+1
log2lowbit(i)+1,求
n
n
n 元能买多少物品。二分买到第几种物品就好了
*E:把两个序列的循环节求出来,假设循环节长度分别是
p
r
,
p
s
pr,ps
pr,ps,那么行可以分为
gcd
(
p
r
,
p
s
)
\gcd(pr,ps)
gcd(pr,ps) 个相似类,相似类里相邻两行的纵坐标序列是大体相同的,先暴力求一行的纵坐标,用 set 维护答案,然后遍历这个相似类,调整 set
看大题解
F:先
p
−
1
p-1
p−1 个人每人都是
{
i
,
p
}
\{i,p\}
{i,p},然后两个人都是
{
p
}
\{p\}
{p},然后
p
−
2
p-2
p−2 组人,第
i
i
i 组人分别是
{
i
+
1
}
,
{
i
+
2
}
,
⋯
,
{
p
−
1
}
\{i+1\},\{i+2\},\cdots,\{p-1\}
{i+1},{i+2},⋯,{p−1}
*G:枚举斜率
k
k
k,相当于每个人有一个限制区间
[
l
i
+
i
k
,
r
i
+
i
k
]
[l_i+ik,r_i+ik]
[li+ik,ri+ik] 求区间交的整点数。随着
k
k
k 的递增,
f
(
k
)
=
max
i
=
1
n
{
l
i
+
i
k
}
f(k)=\max_{i=1}^n\{l_i+ik\}
f(k)=maxi=1n{li+ik} 形成一个下凸壳,
g
(
k
)
=
min
i
=
1
n
{
r
i
+
i
k
}
g(k)=\min_{i=1}^n\{r_i+ik\}
g(k)=mini=1n{ri+ik} 形成一个上凸壳,因此可以求凸包内整点数
J:队友说是沙雕结论一行题
K:只有
15
15
15 种质因子,每种质因子都必须要有人全有、有人全无。
O
(
3
15
)
O(3^{15})
O(315) 大力容斥
XIV Open Cup named after E.V. Pankratiev. GP of SPb.
AB:略
C:
O
(
n
4
k
)
O(n^4k)
O(n4k) dp
E:dp,写好一点做到质数个数平方就行了
F:方法一:推出恰好撞
i
i
i 个的概率,是个组合数式子,数太大了就先取
ln
\ln
ln 后面再
exp
\exp
exp
方法二:
a
n
s
=
⌊
L
M
N
⌋
ans=\lfloor \frac{LM}N \rfloor
ans=⌊NLM⌋
G:最小费用可行流,费用是一个 10 维向量
*H:方法一:每个点维护一个 bitset 表示可达性,每次操作暴力重构
v
v
v 的 bitset,然后按拓扑序更新能到
v
v
v 的点的 bitset,时间
O
(
q
n
3
64
)
O(\frac{qn^3}{64})
O(64qn3)
方法二:把 bitset 换成方案数,时间
O
(
q
n
2
)
O(qn^2)
O(qn2)
看大题解
J:每次往上叠一定不会打结
K:等价于做两次消元之后最多有多少全
0
0
0 向量。枚举第一个向量,给别人消元;然后看有多少向量全
0
0
0 了,以及最多有多少一样的向量
XVII Open Cup named after E.V. Pankratiev. Grand Prix of Europe (CEPC-2016)
A:大模拟
*B:一个点集合法等价于左右各有完美匹配。先左右各用 Holl 定理算出合法的集合,然后双指针算答案
C:找到左右第一个高度为
1
1
1 的图形就好算了
*D:设当前在
(
x
,
y
)
(x,y)
(x,y) 有长度在
[
a
,
b
]
[a,b]
[a,b] 之间的柱子要排序,则把他们按容量分摊到右下矩形的每一个点,递归下去
看大题解
F:一个点如果他父亲要变就给他和新父亲都打标记,一条链从最深的标记开始向上全都要拆掉
*H:先预处理出每个点作为中心的最大边长,这个可以
O
(
n
2
)
O(n^2)
O(n2) dp。然后从大到小激活每个点,每个询问相当于询问两点最早什么时候连通,整体二分或者并查集启发式合并
J:每种点对拿出来,先
A
B
A
ABA
ABA 后
B
A
B
BAB
BAB、先
B
A
B
BAB
BAB 后
A
B
A
ABA
ABA 这两种策略必有一种是最优的
K:考虑差分序列,奇数项和偶数项分开,
00
00
00 一次消掉,
010
010
010 两次消掉
*L:常值变量单独判掉,然后合并本质相同的变量(两个变量相等或相反),最后一定是剩下两个变量
看大题解
Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
A:解法一:线段树维护矩阵
解法二:预处理出每个位置往后
2
k
2^k
2k 个 easy 在哪,每次询问倍增
B:每一位分为
0
0
0 和
1
1
1 两个集合,每个集合单独做再连一条边。这相当于 trie 树上先递归处理子树然后启发式合并
*D:非凸包上的点数,如果是奇数则先手必败,是偶数则先手必胜。
看大题解
F:找循环节
*H:设
f
i
f_i
fi 表示某长度下哈希值为
i
i
i 的方案数。两个字符串拼起来,
f
f
f 数组相当于循环卷积。因此这题 FFT+快速幂。
I:数位 dp
^J:每个数组取最大的 5000 个数暴力
Moscow Pre-Finals Workshop 2016. Kent Nikaido Contest 1
J:略
**A:观察对角线,正的图案是
(
2
,
2
)
(2,2)
(2,2),反的图案是
(
1
,
1
,
1
,
1
)
(1,1,1,1)
(1,1,1,1)。
看大题解
*B:
l
=
1
l=1
l=1 是
k
n
k^n
kn,
l
=
n
l=n
l=n 是 polya,其余的打表可以观察出规律。证明见题解
*D:答案一定是所有边的边权和加上奇点两两配对的最短路,而最短路一定在 MST 上,因此树形 dp 配对奇点。
H:算底层每个点的贡献,相当于算
(
L
,
j
,
k
)
(L,j,k)
(L,j,k) 到
(
1
,
1
,
1
)
(1,1,1)
(1,1,1) 的方案数,等于
(
L
−
1
k
−
1
)
⋅
(
L
−
k
j
−
k
)
\binom{L-1}{k-1} \cdot \binom{L-k}{j-k}
(k−1L−1)⋅(j−kL−k),用 Lucas 定理算奇偶性
*I:固定形状杨表填数(该形状可以分为三个子矩形),钩长公式
K:记最小值为
f
i
r
s
t
first
first,其他堆减去最小值的和为
r
e
s
res
res,当
n
−
1
n-1
n−1 为偶数时取决于
f
i
r
s
t
+
r
e
s
first+res
first+res 的奇偶性,当
n
−
1
n-1
n−1 为奇数时先手必胜当且仅当
f
i
r
s
t
first
first 或
r
e
s
res
res 为奇数。
Urozero Autumn 2016. BAPC 2016
BI:队友说是沙雕题
C:bfs
D:从某艘船开始卡一定是卡一整段,预处理每艘船开始卡会卡到哪里,以及相关时间。然后
d
p
i
dp_i
dpi 表示前
i
i
i 艘船全部过完的答案,转移就枚举从
i
i
i 开始卡,卡完之后等到第
j
j
j 艘船过了再下桥。
E:二分+最短路
G:转成切比雪夫距离的坐标,然后
O
(
n
2
)
O(n^2)
O(n2) 暴力
H:dp,设
d
p
i
dp_i
dpi 表示
i
i
i 最少分成多少个数乘起来。在
n
n
n 的约数的倍数关系图上转移,倍数关系只有 3e6 个
J:二分+二分图匹配
K:先进行链上的递推,再枚举开头的空白
L:枚举
i
i
i,选
a
i
,
a
i
+
1
a_i,a_{i+1}
ai,ai+1,再找一个
∈
(
a
i
+
1
,
a
i
+
a
i
+
1
)
\in (a_{i+1},a_i+a_{i+1})
∈(ai+1,ai+ai+1) 的
AF:
Urozero Autumn 2016. UKIEPC 2016
FHI:略
AE:队友说是沙雕题
C:只用两个寄存器,栈只用来做加法,bfs,最多 38 步
D:最小割
G:到达时间模
2
t
2t
2t,然后人是分段的,枚举起点破环为链,dp,斜率优化
J:每个龙鸣农民只会给一种豆子。
2
B
2^B
2B 枚举从农民得到的豆子集,判断是不是跟每个农民都有交
L:错排写成
∑
1
i
!
\sum \frac{1}{i!}
∑i!1 的形式,
i
i
i 大的时候就没影响了
BK:
NCPC 2017
GJ:略
A:dp,设
f
i
f_i
fi 表示前
i
i
i 个关键点的时间,若不买咖啡则转移到
i
+
1
i+1
i+1,若买咖啡则转移到咖啡范围内的最后一个关键点或咖啡范围外的第一个关键点
B:队友说是沙雕题
C:循环链表
*D:把
0
0
0 到
2
k
−
1
2^k-1
2k−1 视为结点,两个结点如果差一位则连一条边,那么就是个多源 bfs
E:从深到浅激活每一个格子,用并查集维护连通性并记录集合最小值,当与抽水机连通时该最小值就是该集合的贡献
*F:所涉及的范围是,首先一路往最左走,然后有
O
(
30
)
O(30)
O(30) 层(以树为层),随(xie)便(dao)搞(ni)搞(tu)
I:每个点
x
x
x 建一个汇点
x
′
x'
x′,连边
(
x
,
y
)
(x,y)
(x,y) 的时候多连一条
(
x
,
y
′
)
(x,y')
(x,y′),然后从每个点出发跑 bfs 到自己的汇点,最小值就是最小环
K:二分,然后从速度要求最小的船开始满足
H:
XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea
A:扫描线,“回”字分上下左右四个矩形,一起走
C:每条路径按桥的沉没概率从大到小做。设路径的成功概率为
D:从小到大枚举
i
i
i,设
l
a
s
t
last
last 为
i
−
1
i-1
i−1 是从哪里复制的(没有的话就是
0
0
0),那么
l
a
s
t
last
last 就转移到
n
e
x
t
[
l
a
s
t
]
[
s
i
]
next[last][s_i]
next[last][si] 或
0
0
0。
*G:解法一:先做一个初始 MST,然后暴力 LCT
解法二:先做一个初始 MST。对于每个点,将它及它相邻的点拿出来建虚树(虚树边权为 MST 链上的最大值),那么这个点的答案类似于虚树重新做 Kruscal
看大题解
F:当有根树状压 dp
*J:大部分
[
l
,
r
]
[l,r]
[l,r] 的答案等于
[
l
+
1
,
r
−
1
]
[l+1,r-1]
[l+1,r−1] 的答案,于是就这样往里缩,缩到能
O
(
1
)
O(1)
O(1) 计算答案为止。
看大题解
BEHIK:
XVI Open Cup named after E.V. Pankratiev. GP of Europe (CEPC-2015)
AH:略
^D:只有前缀
m
o
d
m
=
0
\bmod~m=0
mod m=0 的位置才能够作为某段的结束位置,因此是
2
前
缀
为
0
的
位
置
数
量
2^{前缀为 0 的位置数量}
2前缀为0的位置数量
F:FFT
I:注意到坐标范围非常小,且半径
<
1
<1
<1。竖线直接枚举
j
∈
[
y
1
,
y
2
]
j \in [y_1,y_2]
j∈[y1,y2],否则假设线段从左下到右上,对
∀
i
∈
[
x
1
,
x
2
]
\forall i \in[x_1,x_2]
∀i∈[x1,x2] 枚举
j
∈
[
⌊
y
(
i
−
1
)
⌋
,
⌈
y
(
i
+
1
)
⌉
]
j \in [\lfloor y(i-1) \rfloor,\lceil y(i+1) \rceil]
j∈[⌊y(i−1)⌋,⌈y(i+1)⌉] 判断
J:最小割树
K:挑出必选的和必不选的,剩下的形成偶环,选其中一边
BCEGL:
Petrozavodsk Summer-2016. Warsaw U Contest, XVI Open Cup Onsite
DG:队友说是沙雕题
B:smart 染色相当于给出了独立集划分,那么如果一个独立集里有一种颜色只出现一次,则整个独立集都换那种颜色,如果造成了别的颜色只剩一种那么就 bfs 一样接着处理其他独立集
E:总数减去不合法,不合法的是滑窗的矩阵乘法
*H:一开始按
a
i
a_i
ai 升序排序,则无论如何修剪都是保持单调递增的。所以可以每次二分出要修剪的后缀,然后线段树维护相关的东西
J:枚举直角顶点,其他点按极角序 two pointers
XVII Open Cup named after E.V. Pankratiev. Grand Prix of Japan
*B:行和列对应二分图两排点,原图有完美匹配等价于二分图每个连通块都是偶数条边,所以相当于二分图找割边
DE:队友说是沙雕题
H:求每个位置的 SG(滑窗 mex,用值域线段树维护最晚出现位置的最小值),然后
a
i
a_i
ai 为奇数的位置异或起来
J:跟这个题类似的 dp
Grodno 2015 (Urozero May 2015 Day 5)
数学场,听说你会数学?
IG:略
*B:dp 枚举正贡献的数的和,假设正贡献为
x
x
x,负贡献为
y
y
y,则合法的充要条件为
x
≥
y
x \geq y
x≥y 且正贡献的最大值
≥
x
−
y
\geq x-y
≥x−y
CF:队友说是沙雕题
H:式子是组合数,Lucas+分块打表
K:问题转化为能否将
A
A
A 拆成若干正整数的和,使得其平方和等于
A
2
−
T
A^2-T
A2−T。
300
300
300 的整数拆分只有 1e7,直接暴力
Petrozavodsk Summer-2017. Warsaw U Contest, XVII OpenCup Onsite
DK:队友说是沙雕题
*A:对于一个点,把它在每种颜色下的并查集根写下来做成哈希,那么哈希值相同的点对就是合法点对。每种颜色启发式合并
*C:连续段最多只有
2
m
2m
2m 段,区间 dp,每个区间第一步只会选择端点的颜色,且端点必须是其颜色的左右端点
*E:解法一:KKT 条件
解法二:设
g
i
2
=
p
i
g_i^2=p_i
gi2=pi 这样就能隐含
0
≤
p
i
≤
1
0 \leq p_i \leq 1
0≤pi≤1 了,然后正常的拉格朗日求条件极值
G:设当前区间
[
l
,
r
]
[l,r]
[l,r] 要分成一个上升子序列和一个下降子序列,找到最小值所在位置
m
i
d
mid
mid(要么是上升的开始,要么是下降的结束),讨论分治
[
l
,
m
i
d
−
1
]
[l,mid-1]
[l,mid−1]、
[
m
i
d
+
1
,
r
]
[mid+1,r]
[mid+1,r] 中的一段。
H:莫比乌斯反演
J:时间离散化,然后网络流
Makoto Soejima Contest 3 (MIPT Workshop Open 2)
欺诈题大作战
*A:贪心模拟最小割
B:记
l
a
s
t
i
last_i
lasti 表示
i
i
i 后面第一个不是
s
\text{s}
s 的字符,先从前往后删
l
a
s
t
i
<
s
last_i<\text{s}
lasti<s 的,再从后往前删
l
a
s
t
i
>
s
last_i>\text{s}
lasti>s 的
C:状压 dp,设
f
s
f_s
fs 表示 prefer list 做到某一项后,
s
s
s 这个月份集的食物已经被确定了。从小到大枚举
s
s
s,然后枚举 prefer list 的下一项
i
i
i,
i
i
i 的出现月份必须不是
s
s
s 的子集才有意义
^D:每个
T
T
T 对应的
S
S
S 的数量是一样的,算出来(考虑每个
t
i
t_i
ti 前插入一堆
t
i
‾
\overline{t_i}
ti)然后乘
(
c
+
d
c
)
\binom{c+d}{c}
(cc+d)
^^E:算这种“割”(虚线)的贡献
*F:二分,要么全砍成
m
i
d
2
\frac{mid}{2}
2mid 以内,要么保留
m
i
d
2
\frac{mid}{2}
2mid 以上最短的一段,记为
a
a
a,然后其他砍成
m
i
d
−
a
mid-a
mid−a 以内
G:分类讨论
*H:只需判断
c
∈
(
b
,
a
+
b
)
c \in (b,a+b)
c∈(b,a+b) 的情况,
c
!
a
!
b
!
=
(
a
+
b
a
)
(
c
+
1
)
(
c
+
2
)
⋯
(
a
+
b
)
\frac {c!}{a!b!}=\frac{\binom{a+b}{a}}{(c+1)(c+2)\cdots(a+b)}
a!b!c!=(c+1)(c+2)⋯(a+b)(aa+b),因此只用考虑
c
+
1
,
⋯
,
a
+
b
c+1,\cdots,a+b
c+1,⋯,a+b 的质因子。考虑质因子
2
2
2 的数量,因为
∑
k
=
1
⌊
a
+
b
2
k
⌋
−
(
⌊
a
2
k
⌋
+
⌊
b
2
k
⌋
)
≤
k
\sum_{k=1} \lfloor \frac{a+b}{2^k} \rfloor - (\lfloor \frac a{2^k} \rfloor + \lfloor \frac b{2^k} \rfloor) \leq k
∑k=1⌊2ka+b⌋−(⌊2ka⌋+⌊2kb⌋)≤k,因此
[
c
+
1
,
a
+
b
]
[c+1,a+b]
[c+1,a+b] 这个区间的长度至多为
2
k
2k
2k 即
O
(
log
(
a
+
b
)
)
O(\log (a+b))
O(log(a+b))
*J:分别考虑一个元素、两个元素、三个元素造成的贡献,三个元素的话是
(
n
3
)
−
(
最
大
值
都
在
一
个
人
身
上
)
−
(
有
两
个
最
大
值
在
一
个
人
身
上
)
\binom n3-(最大值都在一个人身上)-(有两个最大值在一个人身上)
(3n)−(最大值都在一个人身上)−(有两个最大值在一个人身上)
IK:
AIM Fund Contest (MIPT Workshop Open 4)
I:略
EH:队友说是沙雕题
A:字符串必然是
a
a
a
a
⋯
a
aaaa\cdots a
aaaa⋯a 或者
a
a
a
⋯
a
b
b
b
⋯
b
aaa\cdots abbb\cdots b
aaa⋯abbb⋯b 的形式
*C:
k
≤
5
k \leq 5
k≤5:
(
k
−
1
固
定
)
×
(
n
−
k
+
1
选
1
)
(k-1固定) \times (n-k+1选1)
(k−1固定)×(n−k+1选1);
k
≥
9
k \geq 9
k≥9:
(
k
+
1
k
)
\binom{k+1}{k}
(kk+1);
k
=
6
k=6
k=6:
(
3
2
)
×
(
3
2
)
×
(
7
选
1
)
×
(
1
固
定
)
\binom 32 \times \binom 32 \times (7选1) \times (1固定)
(23)×(23)×(7选1)×(1固定);
k
=
7
k=7
k=7:
(
3
2
)
+
(
3
2
)
+
(
3
2
)
+
(
5
选
1
)
\binom 32+\binom 32+\binom 32+(5选1)
(23)+(23)+(23)+(5选1);
k
=
8
k=8
k=8:
(
4
3
)
×
(
3
2
)
×
(
3
2
)
×
(
4
选
1
)
\binom 43 \times \binom 32 \times \binom 32 \times (4选1)
(34)×(23)×(23)×(4选1)
*F:表示成
∑
i
=
1
k
n
a
i
=
n
\sum_{i=1}^k \frac{n}{a_i}=n
∑i=1kain=n,这样的
{
a
1
,
⋯
,
a
k
}
\{a_1,\cdots,a_k\}
{a1,⋯,ak} 集合(
l
c
m
lcm
lcm 互不为倍数)每个
k
k
k 最多 15 个,然后容斥,容斥所要算的
l
c
m
lcm
lcm 也最多 800 多个
*G:先确定符号,然后二分(每次询问
π
m
i
d
\frac{\pi}{mid}
midπ)。去你妈的 30 位精度,卡精度很好玩吗?
J:排序区间不会相交,dp,设
f
i
f_i
fi 表示前
i
i
i 个排好序的最小代价,枚举最后一段排序长度,只有
i
\sqrt i
i 种选择,用单调栈+dsu 啥的求后缀最小值
*K:观察多几个统计量,发现叶子数对于
t
y
p
e
type
type 有显著关系
BD:
Petrozavodsk Winter-2017. Asia-Tsukuba 2016
ABCDG:略
E:
8
!
8!
8! 枚举字母与符号的对应关系,然后表达式求值 考程设题很好玩吗?
F:一开始默认都是 negative,然后 bfs 去把必要的东西翻成 positive
H:每个无向连通块必须是树,把无向树缩起来,拓扑排序求最长路(无向树的结点就 dp 换根)
*I:若
d
=
gcd
(
x
,
y
)
>
5
×
1
0
4
d=\gcd(x,y) > 5 \times 10^4
d=gcd(x,y)>5×104,则
(
0
,
0
)
,
(
x
−
1
,
y
)
,
(
x
d
,
y
d
)
,
(
x
,
y
−
1
)
(0,0),(x-1,y),(\frac xd,\frac yd),(x,y-1)
(0,0),(x−1,y),(dx,dy),(x,y−1);否则解不定方程
a
x
+
b
y
=
d
ax+by=d
ax+by=d,则答案为
(
0
,
0
)
,
(
x
,
y
)
,
(
∣
b
∣
,
∣
a
∣
)
(0,0),(x,y),(|b|,|a|)
(0,0),(x,y),(∣b∣,∣a∣)
J:设
f
x
,
y
f_{x,y}
fx,y 表示圆心在
(
x
,
y
)
(x,y)
(x,y) 的答案,这个函数是凸的,模拟退火
*K:surreal number + meet in the middle
Petrozavodsk Summer-2017. JOI TST 2012 Selection
A:dsu on tree
B:扫描线得到若干个前缀立方体,要求体积并,枚举一维,set 维护折线
C:暴力
F:扫描线
*G:链覆盖=二分图极大匹配,dp
*I:设满足第 1 个人之后,第
i
i
i 个人要顺时针转
a
i
a_i
ai,那么按
a
i
a_i
ai 排序,代价是
min
j
=
2
n
(
2
a
j
+
n
−
a
j
+
1
)
\min_{j=2}^n(2a_j+n-a_{j+1})
minj=2n(2aj+n−aj+1),枚举断点维护这个
DEHJ:
XV Open Cup named after E.V. Pankratiev. GP of Central Europe (AMPPZ-2014)
ABCD:队友说是沙雕题
E:分类讨论,若
p
<
q
∧
n
≥
p
p<q \land n \ge p
p<q∧n≥p 则先手胜,根据这个来推导其余情况
*F:先无视障碍物构造一个平凡的哈密顿回路,然后对于每个障碍物进行修正
G:扫描右端点,单调栈维护区间最大最小,并依此用线段树维护可行左端点
*I:每个上升序列会留下一半人,线段树维护上升序列
*J:一个连通块用其 lca 来代表,两个连通块取交等价于两个 lca 取深度较深的那个,最后判断最终得到的点是否合法
*K:每行建一个点,每列建一个点,对于原来的点
(
x
,
y
)
(x,y)
(x,y) 将行
x
x
x 连向列
y
y
y 一条长度为
0
0
0 的边,然后相邻两行、相邻两列连边,跑最短路
x
1
x_1
x1 到
x
n
x_n
xn。
H:
XV Open Cup named after E.V. Pankratiev. GP of Europe (CEPC-2014)
DEFK:略
*A:离散化时间点,区间 dp,设
f
i
,
j
f_{i,j}
fi,j 表示只考虑完全包含在区间
(
i
,
j
)
(i,j)
(i,j) 内的怪物的最小代价,转移就是枚举区间内最大的怪在什么时候被干掉
B:回文树 dp,设
f
i
f_i
fi 表示
i
i
i 这个回文串最后一步执行 2 操作得到该串所需要的最少步数
^G:当前的形状一定是山峰形,状压 dp 设
f
i
,
s
f_{i,s}
fi,s 表示考虑了前
i
i
i 个数,山峰左半边有
s
s
s 这些数(前
i
i
i 个数的和减去
s
s
s 即可得到山峰右半边),是否可行
*H:结论:若你的 prefer list 是
(
v
1
,
c
1
)
,
⋯
,
(
v
k
+
1
,
c
k
+
1
)
(v_1,c_1),\cdots,(v_{k+1},c_{k+1})
(v1,c1),⋯,(vk+1,ck+1),则必有
v
1
<
v
2
<
⋯
<
v
k
+
1
v_1<v_2<\cdots<v_{k+1}
v1<v2<⋯<vk+1。知道这个之后就倒着
O
(
n
k
)
O(nk)
O(nk) dp
J:比例就是全局的比例,然后贪心
*L:线段树维护区间上凸壳
CI:
JAG Autumn 2014, MIPT2014 Round 1
ABDG:队友说是沙雕题
*C:dp,设
f
i
f_i
fi 表示走到
i
i
i 然后建立存档点的最小期望时间,转移的决策点不会离
i
i
i 太远,不然期望距离太大了
F:先做网络流求不翻转的答案,翻转的边必然是一条从汇点集连向源点集、存在剩余流量的边
H:表达式求值+基础几何
J:tarjan+多重背包
*K:一个格子加上往外两圈共 19 个格子,
2
19
2^{19}
219 枚举所有的可能性,看是否全部都满足中间格子的第一步等于第二步。这是充分必要条件
EI:
XIX Open Cup named after E.V. Pankratiev. Grand Prix of China
F:队友说是沙雕题
A:考虑每个第一次出现的数改成前面出现过的数或者后面第一次出现的数
*D:生成函数推一波
I:burnside+灵活使用组合数公式
BCEGHJK:
Petrozavodsk Winter-2019. Yandex Cup-2019
A:满足贪心性质的
C:上下界可行流
-D:拟阵交
H:每行最小值的最大值
I:若不是完美匹配就一定可行,因此只要判断是否可以完美匹配,任意构造一种完美匹配然后判断方向和
m
o
d
4
\bmod 4
mod4 是否跟初始局面一致
*J:左右晃荡直到到达原点
BEFG:
Petrozavodsk Winter-2019. Oleksandr Kulkov Contest 1
F:队友说是沙雕题
-A:类似于 FWT 的推法
*D:固定一个足够大的
n
n
n,对于每个
f
n
−
b
i
f_{n-b_i}
fn−bi 算出它关于
f
1
,
⋯
,
f
k
f_1,\cdots,f_k
f1,⋯,fk 的线性组合系数(需要常系数线性递推的优化),然后高斯消元
E:每堆石子的最优处理方法是分裂出单独的一个,因此答案为总数除以 2 上取整
H:二分出答案的下取整,然后推式子算出剩下的分数
J:要么问号全都能推出来,要么问号全相同但不知道是什么。前者直接求完美匹配方案数,后者枚举问号是什么然后算完美匹配方案数(注意去重)
^K:答案等于
a
1
−
a
2
a_1-a_2
a1−a2,因为后面的都被抵消掉了
BCGI:
Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection
AC:队友说是沙雕题
*D:每个格子按方向拆成两个点,连边,跑拓扑序
*E:二分一个
m
i
d
mid
mid(但实际上不需要二分),把队伍最后
m
i
d
mid
mid 个男人扔到最前面,队伍合法的条件是任意一个真后缀的
F
−
M
≥
−
1
F-M \ge-1
F−M≥−1
G:环套树 dp
*H:每个点连 8 条边(向上下左右最远的格子连
1
1
1 边,向上下左右相邻的格子连
2
2
2 边),跑三队列 bfs
*I:从大到小贪心匹配,若一个人只剩一个名额了也要立即匹配,用线段树维护
BF:
XXI Open Cup named after E.V. Pankratiev. Grand Prix of Wroclaw
^B:有两条平行线或大于等于三条线时都是 100%,其余情况讨论一下
C:要么环上选 3 个点,要么全选叶子然后环上最多选两个相邻的点
D:缩环以后设有
n
n
n 个点,需要找若干条线段使得能够覆盖
[
1
,
n
]
[1,n]
[1,n],这等价于给
(
i
,
i
−
1
)
(i,i-1)
(i,i−1) 连了
0
0
0 边后从
1
1
1 走到
n
n
n 的最短路
E:每棵树是一个限制条件,列方程,善用
cos
2
α
+
sin
2
α
=
1
\cos^2 \alpha+\sin^2 \alpha=1
cos2α+sin2α=1 化简
FG:队友说是沙雕题
I:
gcd
(
i
,
j
)
=
x
o
r
(
i
,
j
)
=
i
−
j
\gcd(i,j)=xor(i,j)=i-j
gcd(i,j)=xor(i,j)=i−j,枚举
i
−
j
i-j
i−j
^J:总周长是
O
(
n
2
)
O(n^2)
O(n2) 的,因此只有
O
(
n
)
O(n)
O(n) 种不同的周长
K:超边建方点,圆点到方点代价为
1
1
1,方点到圆点代价为
0
0
0,时间倒流跑 floyd
M:每个
a
i
a_i
ai 二分求出以
a
i
a_i
ai 为最大值时能取的最长连续段,这就知道了最多保留多少人;符合“保留最多”的
a
i
a_i
ai 再二分求出把最长连续段的最后一个人扔掉换一个更小的能有多小
AHL:
SWERC-2020
AE:略
C:二分,判断边界的连通性
D:每条边能到达等价于起点到它任一端点的最短距离
<
U
< U
<U
F:设
d
p
i
,
j
dp_{i,j}
dpi,j 表示前
i
i
i 个点共形成了
j
j
j 个子树的方案数,转移就是考虑
i
i
i 是合并两棵子树、合并一棵子树还是新开一棵子树,如果
i
=
R
i=R
i=R 就只能新开一棵子树
G:建出环套树,求每个点往前走
k
k
k 步所经过的点权和
H:主席树
*I:等价于求直径的对数且允许两倍误差。任选一个点出发,求其最远点,然后从最远点出发求新的最远点,迭代 100 次
K:任意后缀数据结构
L:稳定婚姻问题
BJM:
XX Open Cup named after E.V. Pankratiev. Grand Prix of Eurasia
AC:略
F:先用
3
n
3n
3n 步把所有元素按大类分好(依次扫描每个栈,把元素分到相应的大类,属于自己的元素分到下一个大类),然后每个栈
O
(
log
k
n
)
O(\log_kn)
O(logkn) 归并排序
I:平铺即可,注意数字比大小是字典序大小不是数值大小
*J:
n
≤
26
n \le 26
n≤26 状压 dp,
n
>
26
n>26
n>26 贪心每个位置找最远的,一定能找到无解答案
BDEGHK:
Moscow Workshop
ByteDance 2020 Online Selection
M:略
A:
C:二分+圆交(面积交大于 0,或者每个交点都判一下合不合法)
*D:黑白染色,最后黑白颜色数量之差就是无法被覆盖的格子数
*E:dp,枚举
i
i
i,每个出现过的数字最后两次出现的位置假设为
x
x
x 和
y
y
y,把
x
+
1
x+1
x+1 到
y
y
y 连一条线段,那么线段并就是可以做贡献的位置,位置
j
j
j 的贡献是
f
j
−
1
f_{j-1}
fj−1,线段树实现。
*J:树形 dp,设
f
i
,
0
/
1
,
j
f_{i,0/1,j}
fi,0/1,j 表示
i
i
i 号点,它连向父亲的边选
0
0
0 或是选
1
1
1,最紧的限制还有
j
j
j 的距离,的方案数。如果它选
0
0
0,意味着它只用考虑
1
1
1 的限制了,那么儿子里
1
1
1 的限制转移上来,
0
0
0 就没了。选
1
1
1 同理。
K:
1
1
1 至
k
k
k 的逆序对要算进答案里,接下来大于
k
k
k 的数字枚举一个分界线,分界线左边的放左边,右边的放右边
K 加强(Cf Round 609):加个线段树维护一下分界线的枚举
L:队友说是沙雕题
ByteDance 2021 Online Qualification
D:队友说是沙雕题
E:善用
gcd
(
a
1
,
a
2
,
⋯
,
a
n
)
=
gcd
(
a
1
,
a
2
−
a
1
,
⋯
,
a
n
−
a
n
−
1
)
\gcd(a_1,a_2,\cdots,a_n)=\gcd(a_1,a_2-a_1,\cdots,a_n-a_{n-1})
gcd(a1,a2,⋯,an)=gcd(a1,a2−a1,⋯,an−an−1)
F:每次 fail 了一个 testcase 就把它所在的 subtask 及后继的其他 testcase 标为无效
*G:做三个矩阵:行索引、列索引、逆索引,行 shift 就把行索引矩阵全体加减,列 shift 就把列索引矩阵全体加减,求逆就交换逆索引和行列索引
*H:朴素想法是枚举上下边界,然后从左扫到右,维护线性基。改进是下边界下移的时候线性基不要重新构建,而是基于原有的增量更新
I:类似于威佐夫博弈,求出每个
x
x
x 的最小必败
y
y
y
J:式子化成
max
选
k
个
min
(
∑
i
∈
选
了
的
k
个
a
i
,
∑
i
∈
选
了
的
k
个
b
i
+
∑
i
∈
没
选
的
b
i
2
)
\max_{选 k 个}\min(\sum_{i \in 选了的 k 个}a_i,\sum_{i \in 选了的 k 个}b_i+\sum_{i \in 没选的} \frac{b_i}{2})
max选k个min(∑i∈选了的k个ai,∑i∈选了的k个bi+∑i∈没选的2bi),
O
(
n
4
)
O(n^4)
O(n4) dp
^K:每张牌只跟红蓝谁大有关,跟具体数字无关,于是发现红大于蓝的牌更多就红胜,蓝大于红的牌更多就蓝胜,否则平
*^L:首先观察到如果选定了
n
n
n 个合法列,那么列是不用 shuffle 的。于是直接从左到右贪心选列,当前这列合法就保留,不合法就扔了 我不会证
M:算每个格子的贡献,推下式子是个卷积
ABC:
Moscow Workshop Pre-Finals 2020
Day 2 GP of Tokyo
既然你都放到 cf 上了
*D:先是一大串题意转化,变成每一位初始有若干个
1
1
1,每次可以选同一位的两个
1
1
1 扔到下一位变成 4 个
1
1
1。题解做法是二分+dp(有用的状态数很少),我是贪心打补丁
E:题意转化成若干不同的
2
2
2 的幂乘到
a
i
a_i
ai 上,然后
60
⋅
2e5
⋅
200
60\cdot\text{2e5}\cdot200
60⋅2e5⋅200的 dp 冲过去了
*F:最短距离就是
a
i
a_i
ai 跟
b
i
b_i
bi 匹配,用数据结构优化一下算个方案
H:
(
−
1
e
9
,
0
)
(
1
,
1
e
9
)
(
0
,
−
1
e
9
)
(
1
e
9
,
−
1
)
(-1e9,0) (1,1e9) (0,-1e9) (1e9,-1)
(−1e9,0)(1,1e9)(0,−1e9)(1e9,−1)
I:分奇偶构造,大概是
2
i
m
o
d
n
2^i \bmod n
2imodn 这样轮回
ABCGJKL:
2021 Petrozavodsk and Shanghai ICPC Training Camp
Contest 1
C:
E
[
x
2
+
y
2
]
=
E
[
x
2
]
+
E
[
y
2
]
E[x^2+y^2]=E[x^2]+E[y^2]
E[x2+y2]=E[x2]+E[y2],考虑
E
[
x
2
]
=
E
[
(
∑
i
=
1
n
r
i
cos
θ
i
)
2
]
E[x^2] = E[(\sum_{i=1}^n r_i\cos \theta_i)^2]
E[x2]=E[(∑i=1nricosθi)2],展开之后交叉项都消掉了,自身平方项大力积分
D:对于
k
k
k,最优方案是先找到一个
t
y
p
e
type
type 把最小变最大,然后剩下
k
−
1
k-1
k−1 步将全局的前
k
−
1
k-1
k−1 小变成第一步的最大。按
l
e
v
e
l
i
level_i
leveli 排序,决策单调
E:直接
O
(
m
2
n
)
O(m 2^n)
O(m2n) dp
*H:每次询问,从大到小加入
a
i
a_i
ai,每次加入一个数会合并左右连续段成为一个大的连续段,这个连续段的
min
(
l
e
n
,
max
a
−
min
a
)
\min(len,\max a-\min a)
min(len,maxa−mina) 贡献到答案里
ABFGIJ:
Contest 2
破 oj 写啥都 TLE,成心跟我过不去
*E:只有
C
=
M
C=M
C=M 和
C
=
M
+
1
C=M+1
C=M+1 两种情况,前者相当于最大匹配的每一个匹配都恰好选一个点,2-SAT
G:每个质因子的每个极长连续段都是独立的游戏,长为
l
e
n
len
len 的连续段的
S
G
SG
SG 值恰好为
l
e
n
len
len。注意分解质因数不能 pollard_rho,会被卡
^I:有效的
k
k
k 很小,是
O
(
C
3
)
O(\sqrt[3]{C})
O(3C) 的,因此直接
O
(
n
k
)
O(nk)
O(nk) dp
J:以
B
B
B 为“升序”,
A
A
A 只需每次将最大的扔到最后,然后变为子问题即可
^M:样例已经给出了
1
0
6
10^6
106 的答案了,倒推快速幂即可
ABCDFHKL: