AtCoder Beginner Contest 287 A-G 赛时思路+正解

在这里插入图片描述
一把给我加到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 tx( ∣ 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(nm2)的,赛时搜了树上背包优化,发现可以通过只枚举子树大小来优化树上背包,可以优化到 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+mj1,为什么减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题提交

猜你喜欢

转载自blog.csdn.net/qq_52358098/article/details/128783126