CF1265B Beautiful Numbers 题解

Content

给定一个 \(1\sim n\) 的排列,请求出对于 \(1\leqslant m\leqslant n\),是否存在一个区间满足这个区间是一个 \(1\sim m\) 的排列。

数据范围:\(1\leqslant n,\sum n\leqslant 2\times 10^5\)

Solution

看到本题的唯一一篇主席树+二分的题解里面并没有说最巧妙的方法是什么,那我就来给大家讲讲吧qwq。

对于每一个 \(m\),我们不妨弄个双指针 \(l,r\),然后从 \(1\) 的位置开始将 \(l\) 向左移动,将 \(r\) 向右移动,直到碰到某个位置上的数 \(>m\) 为止,这样可以保证这个区间的最大值是 \(1\),最小值是 \(m\),然后只需要判断是否有 \(r-l+1=m\),即区间长度是 \(m\) 即可。

Code

int a[200007];

int main() {
    MT {
        int n = Rint;
        F(int, i, 1, n) a[i] = Rint;
        int l, r;
        F(int, i, 1, n) if(a[i] == 1) {l = r = i; break;}
        printf("1");
        F(int, i, 2, n) {
            while(l > 1 && a[l - 1] <= i) l--;
            while(r < n && a[r + 1] <= i) r++;
            write(r - l + 1 == i);
        }
        puts("");
    }
}
posted @ 2021-12-15 21:36  Eason_AC  阅读(28)  评论(0)    收藏  举报