非常不厉害的是此时我还欠了:
- Solution - Atcoder ARC189E Straight Path
- Solution - Luogu P11392 [JOI Open 2019] 三段跳び
然后我却跑过来写日记了,是否有点抽象。
算了不管了,反正现在都是补课中途抽点时间来学学,哪需要管这么多。
实际上我原本一直想揪点时间读下《研究之美》的。
但是已经到周四了我还是只读了一章,感觉我要废掉了。
不是这真的是天才。
考虑到对于正常的颜色段均摊,时间瓶颈就是维护需要带 \(\log\)。
那么实际上对于 set 和 map 等维护方式,其实线段树是最好写的阿。
我觉得这个的时间复杂度分析会稍微不同点,所以我写下吧。
实际上可以先以 \(\mathcal{O}(\log n)\) 的代价实现线段树上边界的分离,其实就是把 \([l, r]\) 这段区间分开。
考虑对于每个连续段,那么实际上其复杂度最劣下就是类似于线段树直接查这个区间。那么也能知道是 \(\mathcal{O}(\log n)\) 的。
于是时间复杂度是 \(\mathcal{O}(q\log n + \varphi\log n)\) 的,依然相同。
而且这样的一个极大好处是,对于区间查询信息可以直接在过程中维护。
而且或许在 相同合并段信息合并优秀但分裂差(合并只能类快速幂二进制合并时) 会很优秀。
其实刚刚这个想法就已经点出了一个可用之处了:
即贡献方式就为幂次,对应范围为 \([l, r]\),值为 \(v\) 的连续段的权值为 \(v^{\sum\limits_{i = l}^r a_i}\),区间查询一个区间分离开的所有极长连续段权值和,查完后整体赋值。
那么如果正常做就需要快速幂处理左右边界的情况,就需要带一个 \(\mathcal{O}(q\log \operatorname{mod})\) 了。
但是这个方法就不用,因为可以借用线段树信息直接合并,是不是有点厉害。
哦我错了,其实可以单开一个线段树维护关于 \(v\) 的信息然后查询的吧。
确实有道理,不管了,常数大(
我怎么直接编了个题出来,我是不是无敌了。
由此可见,如果真的对一个东西感悟挺深的话,编题或许不难(?)。
但是问题是必须是从这个东西出发思考问题,思维可能被局限,我不太喜欢。
我发现我在 2024.12.06 也写过这个东西。
Luogu P11392 [JOI Open 2019] 三段跳び
当然这不会是题解,只是一些感悟。
看完题我就知道是支配对,但是找不到支配对入手的地方,寄掉了。
于是又去想了想根号算法(为什么 \(5\times 10^5\) 也要想根号?原来是我背的时候忘记记数据范围了,666),也没啥想法。
然后就只能去看题解了,奇耻大辱喔。
其实找支配对的核心就是 除去无用状态。
那这些除去的过程能从哪里去发现呢?
- 去除掉部分变量,只关心部分变量,尤其是只考虑两个会好些。
- 如果有不等式,类似于 \(\le\),那么就是要去思考 左式变小 或者 右式变大。
- 让变量能缩减的范围尽量集中,或者说让可选范围尽量少。
- 通常只需要考虑让一个变量不动,另一个变量动。
怎么没时间了,qaq。
怎么感觉有很多时间还是写不完阿???