ABC312 题解
每个代码都有板子,不建议引用。
如果想要去除万恶的板子,把代码放入 .cpp
文件(此处命名为 a.cpp
)。
然后在 cmd
中输入(当然要先进入对应地址) g++ -E a.cpp -> a.i
。
然后 g++
会发疯,等 .i
文件大约达到 2.1MB
时,停止进程,把最后一段看得懂的代码粘贴过去就行了。
详细原理:https://blog.csdn.net/weixin_39455125/article/details/123994743
A
Overview
字符串分支结构。(我是怎么想到的)
Description
给出一个字符串,问该字符串是否为 ACE
,BDF
,CEG
,DFA
,EGB
,FAC
和 GBD
Idea
直接暴力扫一遍就可以了。
B
Overview
模拟题, O ( n 2 ) O(n^2) O(n2) 解决
Description
前置知识:二维数组。
给定一个字符矩阵,每个字符为 #
或 .
,问满足以下条件的
9
×
9
9\times 9
9×9 的矩阵个数:
- 左上
3
×
3
3 \times 3
3×3 和 右下
3
×
3
3 \times 3
3×3 的子矩阵都是
#
。 - 与上面提到的矩阵相邻的 L 形边框都是
.
。
Idea
考虑对应法,每个 ( x , y ) (x,y) (x,y) 表示一个 9 × 9 9 \times 9 9×9 的矩阵。
比较烦,这里只给代码。
C
Overview
离散化 + 差分。
Description
给定 n n n 个卖家和 m m m 个买家。
每个卖家的可接受价格范围为 [ a i , + ∞ ) [a_i, +\infty) [ai,+∞)。
每个买家的可接受价格范围为 ( − ∞ , b i ] (-\infty, b_i] (−∞,bi]。
问最小的 x x x,满足可接受的买家个数小于等于可接受的卖家个数。
Idea
前置知识:二分、STL。
Solution 1
显然问题满足单调性,二分答案。
复杂度 O ( n log K ) O(n\log K) O(nlogK),其中 K K K 为 a ∪ b a \cup b a∪b 的元素的最大值。
Solution 2
注意到答案肯定是 a i a_i ai 或 b i + 1 b_i + 1 bi+1。
将
a
,
b
a,b
a,b 离散化,扔到一个 vector
里。
暴搜即可。
D
Overview
简单 DP。
Description
给出一个括号串,其中 ?
代表不限。
问匹配括号串的方案数。
Idea
前置知识:DP,括号匹配。
设 d i , j d_{i,j} di,j 为 i i i 个字符,栈内还剩 j j j 个元素。
这样转移方程就可以出来了。
d i , j = { d i − 1 , j − 1 s i = ( d i − 1 , j + 1 s i = ) d i − 1 , j − 1 + d i − 1 , j + 1 s i = ? d_{i, j}=\left\{\begin{aligned}&d_{i - 1, j - 1} &s_i = \texttt{(} \\ &d_{i - 1, j + 1} &s_i = \texttt{)} \\ &d_{i - 1, j - 1} + d_{i - 1, j + 1}&s_i=\texttt{?} \end{aligned}\right. di,j=⎩ ⎨ ⎧di−1,j−1di−1,j+1di−1,j−1+di−1,j+1si=(si=)si=?
E
Overview
恶评,最多 ∗ 1400 *1400 ∗1400。
但还是好题。
Description
给出 n n n 个长方体,彼此没有体积交。
问有多少对长方体有面积交(共用面)。
Idea
前置知识:STL 进阶。
绝世好题。
枚举每一个二维单位方格(当然三个方向分开处理),看有没有被共用。
需要存储每个方格被谁共用,存到 set
里面。
思考:为什么这么做是对的?为什么枚举方格而不枚举单位立方体?
如果一个方格被三个长方体共用,显然有体积交,排除;
如果枚举单位立方体,在立方体角上或边上立方体并不一一对应,从而导致了有可能被三个共用。
复杂度 O ( K 3 ) O(K^3) O(K3),其中 K K K 指最大的坐标。