daimayuan#886. 不降子数组游戏 (三分, 分块)

image
image

  • 注意求的是子数组,所以把原数组按每段递增划分,一段的贡献就是 len * (len + 1) / 2. 这样分块,求前缀和就能O1的求出一段区间的不讲子数组个数。
ll f( int l, int r ) {
    if( id[l] == id[r] ) {
        return cal( l, r);
    }
    return cal( l, R[id[l]] ) + cal( L[id[r]], r ) +  pre[id[r] - 1] - pre[id[l]];
}
  • Platina 想要分数尽可能大,所以他一定选 左边界lt或右边界rt
  • Yuto想要分数尽可能的小, 但是他选择右边界或左边界时候分数最大,那么他选择在中间一个位置最好。 三分出这个位置。 (不懂为什么是单极值函数)
posted @ 2022-05-31 16:58  qingyanng  阅读(19)  评论(0编辑  收藏  举报