CF1919D 01 Tree

Problem - 1919D - Codeforces

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\) 缩成一起。

posted @ 2024-03-02 22:56  FOX_konata  阅读(5)  评论(0编辑  收藏  举报