洛谷大水赛初体验
因为最近一直在刷紫书,而基本上都是看了题解后再动笔开始写,让自己产生一种思路无比顺畅的感觉,结果在今天翻出一个洛谷入门级别的比赛题目尝试了一下才发现自己的菜。
具体比赛见链接
本文记录刷题后的思路和反思
第一题
简单的找规律
因为要求被除数连续变化,所以向下取整的商一定是连续变化的。 因此可以分为两种情况:
- 连续的商代表其最大公因式只有 1 1 1
- l l l 、 r r r 和 x x x 相除后的商相同,说明最大公因式为这个数本身
第二题
贪心
思考第一次不买最大的,后续换的时候钱就是浪费了,如果不直接换最小的,无法保证最多。如果再换最小的,相当于用次小换最小,还是存在浪费。
因此使用最大直接换最小的,换到不能换为止。
第三题
涉及到概念 m e x mex mex
技巧1:
寻找题目思路首先看数据,本题提供明显暗示在于
0
≤
a
i
,
b
i
≤
n
0\leq a_i,b_i\leq n
0≤ai,bi≤n,这意味着可以直接枚举获得判断结果,且本题在$O\left ( n \right ) 下是能够通过的。
技巧2
一个的键匹配多个值是可以直接用
v
e
c
t
o
r
vector
vector实现,声明方式直接全局变量vector<int> v[manx]
即可,使用时在对应键中push_back()
即可。
本题核心
如果一个区间的
m
e
x
=
a
mex = a
mex=a ,满足以下条件:
- 区间未出现 a a a
- 区间出现 1 / t o a − 1 1 /to a-1 1/toa−1
因此若考虑是否存在一个区间的
m
e
x
mex
mex 值是
a
a
a,我们尝试把整个区间以
a
a
a 为端点划分成若干段,只要每一段内(不含端点
a
a
a)中出现$ 1 \rightarrow a - 1 $那么就存在一个区间的
m
e
x
mex
mex 值是
a
a
a
如图:
a
…
a
…
a
…
a
a \dots a \dots a \dots a
a…a…a…a
即只要有一个 … \dots …存在$ 1 \rightarrow a - 1 $ 那么就存在区间 $mex = a $
具体化
当本题的
a
i
=
b
i
a_i = b_i
ai=bi 时,代表这里的数是固定的,而本题需要的结果是
max
{
r
−
l
+
1
−
mex
{
c
l
,
c
l
+
1
,
…
,
c
r
−
1
,
c
r
}
}
(
1
≤
l
≤
r
≤
n
)
\max\{r-l+1-\operatorname{mex}\{c_l,c_{l+1},\dots, c_{r-1},c_r\}\}(1\le l\le r\le n)
max{r−l+1−mex{cl,cl+1,…,cr−1,cr}}(1≤l≤r≤n)
而在诸个枚举的过程中无需考虑是否为那个
m
e
x
mex
mex,因为本题要求的结果是一个最大值,最大值枚举过程中会比较出那个
m
e
x
mex
mex(因为同样的区间,枚举0时结果本身会大于枚举1时的,也就找出了
m
e
x
mex
mex)。
第四题
线性问题
看数据确定需要线性复杂度,看结果函数
max
{
a
l
,
a
l
+
1
,
⋯
,
a
r
}
−
min
{
a
l
,
a
l
+
1
,
⋯
,
a
r
}
−
r
+
l
−
1
\max\{a_l,a_{l+1},\cdots,a_r\}-\min\{a_l,a_{l+1},\cdots,a_r\}-r+l-1
max{al,al+1,⋯,ar}−min{al,al+1,⋯,ar}−r+l−1
知道,如果需要得到最优解,
m
a
x
max
max 和
m
i
n
min
min需要在两端, 由后缀的
−
r
+
l
−
1
-r + l - 1
−r+l−1确定,说明所选片段越短越好。
因此可以以左端点为最小值,右端点为最大值扫描一遍,记录最小值时同时将 $ l$ 记录其中。
再以右端点作为最小值,左端点作为最大值扫描一遍。
最后得到最终结果。