开考
这次的题目看着比较简单,第一题一眼前缀和,第二题是双指针,三四题不很一眼,感觉可以冲 300pts。
果然 T1 直接秒掉,J 组难度。
开写
第二题感觉是双指针,而且也很有单调性,但是怎么实现并没有一下想出来,写了大概 10min 过了样例和自测,但是观摩的时候发现假了,我写的是伪双指针,\(\mathcal{O}(n^2)\) 直接炸。但是不慌,直接去看 T3。
T3 好像是简单的初中数学证明,甚至写了一个式子就证明出来一个小小的贪心,但是感觉 \(\mathcal{O}(n^2)\) 只能拿一半,没事,先开 T4。
刚开始想到了树状数组和线段树(然而并不会写),于是想到分治加暴力枚举遍历 \(\mathcal{O}(n^3\log n)\),但是能不能过 \(3000\) 有待商榷。
觉得 T2 必须切掉,然后又跳回去,发现在原来基础上改动一点就变成线性了,吓死,感觉讲过?赛后确实。
检查 T1,发现少开了一个 long long,惊。
只剩 30min,觉得蒙不出线段树,就搞一搞 T3,但是什么也没搞出来。
之后就认真的看 T1 和 T2 的 long long,总是感觉不太靠谱,然后把 map 改成 unordered_map,少个 \(\log\) 还安心。
出分
280pts,低于赛前预期,但是高于赛中预期,总而言之还是没有达到目标,不满意。感觉这次简单,起码应该 300pts,但是没有做到。
知识纰漏
T1、T2 没什么可说的。
T3 贪心正确,拿了 50pts,其实正解是需要加上二分,这样线性变 \(\log\) 就过了,自己又梳理一下发现:\(\mathcal{O}(n^2)\) 过不了但是 \(\mathcal{O}(n\log n)\) 可以,其实无限启示我们去搞二分,又想出来一个答题小技巧:通常是先写在算复杂度,或许有的时候可以根据复杂度反推做法?
T4 是线段树,但是有很巧妙的异或哈希做法,鉴于一个数出现两次后的异或和等于没异或,这是一个突破口,感觉还是没做到根据题目性质去找做法,思考的还是不够(悲)。
策略得失
这次没做到完全深入思考,但是可以说吸取了上次的教训,Druit 用 map 然后挂了(好像是 map 是平衡树然后 unordered_map 是哈希表),STL 真的要慎用。
感觉检查一下 long long 是无比正确的。
总结
感觉写博客还是有用,不然双指针不会这么一眼。
前几天总结 STL 很有用,而且还向老师求证过,这次没有挂分,记得好像有人说过什么 "Stay foolish."(好像是 Jobs 吧),每天都要问问题,而且没几天了。
我爱算法竞赛进阶指南。
记住算法的时间复杂度,不仅能正着算还能反着搞。
代老师说可能会 MLE?还好我会算内存,但是无脑开 long long 可能会没,#define int long long
也不是好习惯,以后改用 typedef。
T3 能拿 30pts 其实没想到,因为那个爆炸复杂度不故意卡也会没(虽然时限是 3s),最后手推发现有一个 \(\frac{1}{4}\) 的常数,没想到这个东西除了卡人还能帮人?
线段树和树状数组还是一言难尽,欠练,突然发掘自己不了解 lowbit,上坑人 CSDN 看了看感觉悟了,豁然开朗感觉好爽。
想起来幻想繁星大佬,我要学分块,问了问只要能写,\(10^5\) 的数据都是有希望的。
改进方案
我要学分块,明天正好休息,感觉一天时间没问题。
现在有点混沌,还是先把提高组搞好,斜率优化和凸包先放一放。
桌面上一坨待办,不愁没事做。