一把给我加到1219了,青大小蒟蒻表示很开心。
A - Majority
题意 问你
"
F
o
r
"
"For"
"For"字符串数量是否比
"
A
g
a
i
n
s
t
"
"Against"
"Against"数量多。
思路
m
a
p
map
map暴力即可。
A题代码
B - Postal Card
题意 给你一个长度为6的字符串数组
S
i
S_i
Si,以及长度为3的字符串数组
T
i
T_i
Ti,问你长度为3的字符串数组是否在
S
i
S_i
Si的后缀(后面三个)出现过。
思路
m
a
p
map
map暴力哈希记录前面的最后三个字符组成的子串,暴力判断即可。
B题代码
C - Path Graph?
题意 问你图是不是一条链
思路 找一个度数为1的点暴力dfs即可,细节是暴力dfs的时候只能往下递归一次。
C题代码
D - Match or Not
题意 给定两个字符串
s
s
s、
t
t
t,问从字符串
s
s
s中把长度为
x
x
x的前缀和长度为
∣
t
∣
−
x
|t| - x
∣t∣−x(
∣
t
∣
|t|
∣t∣表示字符串
t
t
t的长度)的后缀拼起来,问你能否与字符串
t
t
t相等,
x
<
=
∣
t
∣
x <= |t|
x<=∣t∣ ,
s
.
s
i
z
e
(
)
<
=
2
e
5
s.size() <= 2e5
s.size()<=2e5,对于不同的
x
x
x输出一行。
思路 找
s
s
s串和
t
t
t串的最长前缀和最长后缀,然后对于每个
x
x
x我们判断前缀和后缀是否分别在最大前缀和最大后缀内部即可。
D题代码
E - Karuta
题意 给定字符串数组
S
i
Si
Si,问每个字符串与其他字符串的最长公共前缀是多少,字符串的字符总和保证不超过5e5。
思路 这是一道字典树模板题,赛时抄了板子就过了。
E题代码
F - Components
题意 给你点数为
n
n
n一棵树,我们从中选择非空点集(点集种类有2n-1种),子图由你选的点集,以及原树上能在点集相连的所有边组成,
n
<
=
2
e
5
n <= 2e5
n<=2e5,题目求生成的子图连通块的个数为
x
x
x的子图种类有多少,不同的
x
x
x在不同行输出 。建议看洛谷题意配合我的题意去理解。
思路 是一道比较典型的树上背包题目,我们把连通块个数看成物品的容量,然后考虑点选不选对连通块的影响,我们选择多开一维表示该节点是否被选。树上背包没有优化的时候是
O
(
n
∗
m
2
)
O(n * m ^ 2)
O(n∗m2)的,赛时搜了树上背包优化,发现可以通过只枚举子树大小来优化树上背包,可以优化到
O
(
n
2
)
O(n^2)
O(n2)的,复杂度解决了,我们考虑状态转移,我们考虑从下向上合并,当前的节点是
u
u
u,以及合并的容量为
m
m
m,当前是否选了
u
u
u节点
s
t
st
st,考虑合并已经合并的
u
u
u子树和未被合并的
j
j
j子树(
j
j
j是
u
u
u的儿子) ,我们考虑四种情况:
1.
u
u
u子树
u
u
u节点被选,
j
j
j子树
j
j
j节点被选,我们发现
j
j
j节点所在的连通块会与
u
u
u所在的连通块合并,合并之后的连通块个数是
m
u
+
m
j
−
1
m_u + m_j - 1
mu+mj−1,为什么减1呢,因为
j
j
j节点所在的连通块会与
u
u
u所在的连通块合并,导致连通块个数减1,剩下的不变。
2.
u
u
u子树
u
u
u节点被选,
j
j
j子树
j
j
j节点不被选,合并之后的连通块个数是
m
u
+
m
j
m_u + m_j
mu+mj。
3.
u
u
u子树
u
u
u节点不被选,
j
j
j子树
j
j
j节点被选,合并之后的连通块个数是
m
u
+
m
j
m_u + m_j
mu+mj。
4.
u
u
u子树
u
u
u节点不被选,
j
j
j子树
j
j
j节点不被选,合并之后的连通块个数是
m
u
+
m
j
m_u + m_j
mu+mj。
然后
d
f
s
dfs
dfs递归即可。
F题代码
G - Balance Update Query
题意 给你
n
n
n个种类的物品,每个物品有
S
S
S分数和
V
V
V容量,执行以下三个操作:
1.把种类
x
x
x的物品的得分改为
y
y
y
2.把种类
x
x
x的物品的容量改为
y
y
y
3.选
x
x
x个物品,如果当前可选的容量小于
x
x
x输出-1,否则输出选择的
x
x
x个物品(
n
n
n类物品种选择)的最大得分和 。
n
<
=
1
e
5
,
s
<
=
1
e
9
,
x
<
=
1
e
4
n <= 1e5 , s <= 1e9 , x <= 1e4
n<=1e5,s<=1e9,x<=1e4
思路 看到题之后我一眼平衡树,然后想了2
m
i
n
min
min之后发现可以离线用一种更简单而且套路的方法去做,我们考虑对
s
s
s得分离散化,然后考虑建两个树状数组(下标的含义是得分权值)分别维护容量和得分总和,然后我们考虑用二分套树状数组的方法去解决此问题,即二分得分权值,把大于等于得分权值的物品全部加进去,然后判断个数是否满足小于等于
x
x
x。然后一道看起来很复杂的问题用了比较经典的方式去解决了。
G题提交