Live2D

「下饭食谱」千年食谱颂

  其实是各种下饭操作与名菜食谱。(

零·策略篇

多校 NOIP 2021.11.05:

  这个真的是,我每次打毛毛虫剖分都是 rush 状态 qwq。像这种 已知代码难度大、不便于调试的算法,尽量在考试前期发现并制定策略。如果不幸在后期才看出来,必须做好止损工作,例如完善其他三题(包括最终检查,freopen 等),若本题已经写了部分分,则另开文件 rush。调试过程中千万不要慌,骂自己几句然后冷静下来,这种长难代码一定要理清思路,写的时候就不要给调试过程挖坑。

  By the way,注意若有多个代码模块逻辑上高度相似(比如复制粘贴改变量名这种),一定小心有区别的地方;若在一处发现了 bug,立马考虑其余几处是否有相同 bug。

壹·读题篇

「LOCAL/20211115」毒瘤聒噪怪:

  • 以为是对于 \(k=1..n\) 分别求,原来是对 \(k=1..n\) 求和。你稍微看一样样例也不至于浪费一个小时。

「CSP-S 2021」「洛谷 P7914」括号序列:

  • 我谢谢你。

「多校联训」挖掘机:

  • 贪心显然,每次给定 \(K\)?那就根号分治……Woc 根本过不去!自闭一个小时发现 \(K\) 是常数,麻了。注意多次询问是否共用常量参数。

贰·思路篇

「CF 1589E」Game with Stones.

  • 幸好是别人的号。本来的结论伪了,重新修正后还沿用原结论“需要两边扫一遍”的要求,就死啦死啦。

「多校联训」超级加倍:

  • 出于对点分的热爱尝试将二维偏序优化至线性.jpg

「多校联训」石子游戏:

  • 瞬间推出 SG 函数有取模,瞬间忘记取模转化起手式:\(x\bmod y=x-\lfloor\frac{x}{y}\rfloor y\),并且整除结果是可枚举的。这样才能进一步转化。

「多校联训」黑客:

  • 有的题,真就该傻瓜题用傻瓜方法。热烈祝贺 OneInDark 玄学数论分块嵌套 + 莫比乌斯反演 + 剪枝完成了暴力能过的题目!

叁·实现篇

  • 「名菜警告」:WQS 二分,斜率区间 \([0,2\times10^9]\)
    int l = 0, r = 2e9;
    while (l < r) {
        int mid = l + r + 1 >> 1;
        ...
    }

某 NOIP 模拟赛 T2

  • 「名菜警告」\(0^0\equiv 1\pmod p\), \(0^{p-1}\equiv 0\pmod p\).

阿巴阿巴为什么要记录题目名?

  • 「名菜警告」:对 __gnu_pbds::gp_hash_table 的 value 的直接引用会因为引起内存整体移动的操作(例如插入元素)而失效!

不愿透露姓名的题目.jpg

  • 预处理 DSU, 每个点用 DFN 在线段树上插入初始值。嗯,预处理完 DSU 了,我们来求 DFN。

「洛谷 P5616」「模板」左偏树(可并堆)

  • 「名菜警告」:左偏树删除结点 \(u\) 时,\(u\) 的父亲需要指向合并其左右儿子得到的新根而非直接删除,这是因为 \(u\) 子树内可能有点需要通过 \(u\) 的父亲找根。

「洛谷 P5616」恶魔之树:

  • 套路根号素因子分治,要按最大素因子排序,然后欧拉筛顺手筛出来一个最小素因子,按最小素因子排序。😅

  • 「名菜警告」:费用流势能 Dijkstra 带 Dinic,一般 Dinic 里有个无法流的剪枝:if (!ret.fi) dis[u] = IINF;,但是 dis 要被拿去更新势能,所以就寄了。这个时候应该直接让当前点留在增广栈里,到下一次增广的时候再把栈内标记清空。

《懒得透露姓名的题目》:

  • 二维数组 a[n][m] 理论上只要 \(x*m+y\in[0,nm)\)a[x][y] 可以瞎访问(?)真写大 UB 了。

  • vector 很多,每次插几个就 clear 的时候,可以 shrink_to_fit 卡空间。


「ZJOI 2010」「洛谷 P2570」贪吃的老鼠:

  • 😄 打成 😅!😄 打成 😅!你娘的不是把 😅 打成 😄 就是把 😄 打成 😅!

「LOCAL」路过中丹:

  • sam[] 是某前缀和数组,判断 sam[r] - sam[l + 1] > 0,可惜 \(l=n\) 的时候 \(l+1\) 就是个 \(0\),莫得前缀和。

「洛谷 P3369」「模板」普通平衡树:

inline bool valid(const int u) {
    return std::max(siz[ch[u][0]], siz[ch[u][1]]) > siz[u] * ALPHA + 5;
}

inline void balance(const int u, const int f) {
    if (valid(u)) return ;
    ...
}

「洛谷 P5212」SubString:

  • 强制在线解密,维护秘钥 mask,题面只给了代码形式的解密过程,过程里有对 mark 的赋值,我用 lambda 抓的 mask 变量所以秘钥会在解密过程中变化,然而别人的函数传了个参数 int mask就很难想想 SAM + LCT 的题我只在这个地方调了半天 qwq。

「JSOI 2019」「洛谷 P5332」精准预测:

  • 2-SAT 建真假点,函数 getId(i, j, tf) 计算 \((i,j)\) 的真 / 假点编号,用到了真点数量 kpre[n],然而我一边滚 kpre 的前缀和一边建图。😅

「LOJ #6538」烷基计数 加强版 加强版

  • \(f(x)=1\) 的 DFT 是 \(\lang 1,1,\dots\rang\)\(f(x)=x\) 的 DFT 是 \(\lang \omega_n^{0..n-1}\rang\),这个直接 addeq(DFT[0], 1) 确实蚌埠住了。

《不愿透露姓名的题目》

  • 交换非负整数,a ^= b ^= a ^= b,当 ab 指向同一个内存位置,语句等价于 a=0

「JSOI 2019」「洛谷 P5334」节日庆典

  • char s[...]; 然后 std::cin >> (s + 1); CE 了,本地没警告啊……

「ZJOI 2013」「洛谷 P3337」防守战线:

  • SPFA 手写队列(队头队尾移动指针),长度只开结点数。

「BZOJ 2839」集合计数:

  • 预处理 \(2^i\),模 \(p\),但它被放在指数上。

「WF 2011」「BZOJ #3963」MachineWorks:

  • 函数形参的类型推导(eg int func(auto a))是 C++20 标准的语法。

「多校联训」第 k 大查询:

  • std::set::iterator 自加最坏 \(\mathcal O(\log n)\)

「多校联训」树上路径:

  • 换根 DP,因为删除一个儿子后还要求最大和次大,所以得维护前三大,但是判断细节就很细节(?)调了老久。诸如此类几个东西比大小,反复检查,举例验证,出 bug 时优先核验

「洛谷 P5903」「模板」树上 k 级祖先:

  • 「名菜警告」:记得判 \(u\) 的零级祖先为 \(u\) 自身,否则直接用 __builtin_clz(k) 是未定义的。

「OurOJ 9865」路径中位数:

  • 点分治,分治中心的贡献没有加在桶里。

「多校联训」肯德基:

  • 有一个 if 用于剪枝,但在极限数据时只会变成常数。为了卡常把它删掉了,而没想到小数据也会因此跑满,全部 T 飞了 qwq。

「UVA 10735」Euler Circuit:

  • \(n\) 打成 \(m\)\(n\) 打成 \(m\)!你他娘不是 \(m\) 打成 \(n\) 就是 \(n\) 打成 \(m\)

「CERC 2016」「洛谷 P3679」Bipartite Blanket:

  • Two-pointers,其中一个指针扫到 \(-1\) 就不扫了,但其实这其实是意味着接下来一整个序列都合法。

「CSP-S 2020」「洛谷 P7077」函数调用:

  • \(n,m,q\) 反复手误,你再敢不造 \(n,m,q\) 互异的数据检查就去死吧。(

「NOI 2016」「LOJ #2083」优秀的拆分:(By OneInDark)

  • 「名菜警告」:我们写 SA 一般有个 cmp 函数:

    auto dif = [&]( const int x, const int y )
        { return id[x] != id[y] || id[x + w] != id[y + w]; };
    

    x + w 会越界……吗?并不是,若越界,id[x] != id[y]……吗?还是不是,当 x == n - w + 1,有可能刚好越界到 id[n + 1],一般数组会有冗余空间所以不会 RE,但多次后缀排序一定要清空到 \(n+1\)!!!

    错误示例(By OneInDark):WA submission


「CF 113D」Museum:

  • 高斯消元,EPS=1e-7 忽略一些系数导致巨大精度误差。在确定不影响复杂度的情况下,实数消元还是无脑全部枚举一遍吧。

「CF 1368G」Shifting Dominoes:

  • 求矩阵并的那种线段树的 pushup:

    inline void pushup( const int u, const int len ) {
        // cnt[u] = cvr[u] ? len : cnt[u << 1] + cnt[u << 1 | 1]; // RE.
        cnt[u] = cvr[u] ? len : len > 1 ? cnt[u << 1] + cnt[u << 1 | 1] : 0;
    }
    

「CF 321D」Ciel and Flipboard:

  • 思考一个结论的时候把“平移相等”顺口说成“对称”,代码写出来真写成关于对称轴对称了……

  • \(a_{i,j}\in[-10^9,10^9]\),四个加起来没开 long long

  • 每次测样例必须所有样例同时通过;检查代码时检查细节、逻辑思路的正确性。


「CF 1580C」Train Maintenance:

  • 根号分治,一种情况在差分,一种情况没差分,写着写着就乱套了。任何分类求解的算法一定要用同组数据测试不同情况!

「CF 1598F」RBS:

  • 可持久化线段树写成动态开点完全没有持久化线段树。

「多校联训」大鱼吃小鱼:

  • 瞬间看出标算结论,瞬间想出标算,一经思考:“我草这 treap 被 split 成这么散怎么还原?”痛失一百分。有时候平衡树非常吻合思路的进程,但实现时可以考虑权值线段树作为细节少、易调试的数据结构。
  • 线段树二分,if (l == r) 这个 statement 里不要忘记就算 \(l=r=1\)(整棵树左端点)也是有可能不在二分上界里的,注意判。

「UVA 1592」Database:

  • 清空了,但没有完全清空。

    static std::string str;
    while (...) {
        if (...) { do something with str; }
        else { str.clear(); }
    }
    do someting with str;
    // str.clear(); !!!
    

「多校联训」树:

  • 有一个东西 h,我把它换成 rh,并重新定义了 h 的含义,然而某处本应是 rh 的地方没改……
posted @ 2021-10-05 19:48  Rainybunny  阅读(1109)  评论(2编辑  收藏  举报