CF1919D 01 Tree
-
今天是山东省选 \(Day1\) 考完的晚上,其实考完 \(NOIP2023\) 的时候就已经退役了,这次来只是考着玩的。一想到明天晚上又要回到 \(whk\) 的生活心里又有些对 \(OI\) 舍不得。
-
我不清楚明天的省选到底会正常发挥还是心态爆炸,也不知道题难还是简单,我只知道明天就要结束了。
-
最近自己在训练 \(cf\) \(1400 \sim 2100\) 的贪心题,主要是想训练一下思维,发现自己 \(>2000\) 的题产出挺困难的,有空训练一下。
-
不说多了,开始说这道题。
-
首先分析第一个样例,同样例解释的图,我们可以发现我们可以把
3 4
的那一部分缩成一个点,此时序列变为2 1 0 1
,依然是可构造的。 -
因此我们就来试着猜想一个结论:如果原序列每次把相邻两个满足
x x+1
的数缩成x
,缩到最后只剩下 \(0\) 的话就说明满足,否则不满足。 -
我看到这个问题转化后首先想的是区间 \(dp\),但显然复杂度太高了。然后又想因为不可能会有数比最大值更大,因此我们可以从最大值开始操作,看能否操作。但又发现对于多个相同的最大值无法确定判断顺序。遂看题解。
-
题解里有一个人的做法非常巧妙,就是对于每个值非 \(0\) 的 \(i\),记左边第一个 \(< a_i\) 的位置为 \(L\),右边第一个 \(> a_i\) 的位置为 \(R\),则需要满足 \(a_L,a_R\) 中至少有一个是 \(a_i\),并且原数组中有且只有一个 \(0\)。
-
为什么这么干是对的呢?我感性理解了一下。当对最大数用这种方式判断的时候,显然成立。然后对于一个 \(a_i\),如果 \([L,i)\),满足条件则一定会被缩成 \(a_L\),然后又能和 \(a_i\) 缩成一起。