常见优化技巧

常见优化技巧

  • P1102 A-B 数对

    因为 \(a-b=c\),所以 \(a+c=b\),也就是对于每个数组内的 \(a\),要找出所有等于 \(a+c\) 的元素个数。

    因此可以对数组进行排序,再写两个二分方法,分别查询第一个合法元素和最后一个合法元素,通过两方法返回的索引之差计算元素个数,然后累加答案即可。

    同样地,我们可以使用库内置的二分方法。

    upper_bound(a+1,a+1+n,k) 返回最后一个元素值等于 k 的下一位索引, lower_bound(a+1,a+1+n,k) 返回第一个元素值等于 k 的索引。

  • P1638 逛画展

    因为我们要看到所有画师的画,所以可以维护一个区间,用一个桶记录该区间内画师的画的数量。

    可以先设置区间的左右端点(即左右指针)均为 1,并维护一个计数器,表示目前区间内画的种类数,接着重复执行以下步骤:

    • 每次r向右移动,将新画加入区间。如果这个画家是第一次出现,计数器自增;
    • 在准备将左指针l向右移动时,如果当前画作a[l]在区间中只有1幅,那么可以将计数器自减,维护计数器表示的意义永远是画的种数
    • 尝试将左指针向右移动;
    • 如果移动后仍然包含所有画家,继续移动;
    • 如果移动后缺少某个画家,回退一步并退出循环;
    • 如果计数器等于画的种类总数,则更新答案。
  • P2671 [NOIP 2015 普及组] 求和

    推式子发现 \(x\)\(z\) 同号,与 \(y\) 没有关系。

    进而把每个颜色种类按照奇偶性再分类,最后把奇数产生的分数和偶数产生的分数加起来即可。

    再推式子,发现一个前缀和,可以优化。

  • P2866 [USACO06NOV] Bad Hair Day S

    开一个单调栈,从栈底到栈顶单调递减。

    如果一个元素要入栈,并且栈顶的元素小于或等于该元素,那么弹栈,直到栈顶的元素大于该元素,并将该元素入栈。

    将每个元素入栈时,都将栈的大小累积到答案里。

  • P2032 扫描

    滑动窗口维护区间最值板子。

    背下来吧。

posted @ 2025-11-01 10:03  L-Coding  阅读(10)  评论(0)    收藏  举报