Codeforces Round #852 (Div. 2) C. Dora and Search

https://codeforces.com/contest/1793/problem/C

 

 

我们考虑进行构造。不难发现,对于一个序列,如果它的左端点不是整个序列的最大值,那么无论在序列的右边加怎么样的值,它的左端点仍然不可能是整个序列的最大值。对于最小值或者右端点都是一个道理。

考虑从这个序列从头和尾两个部分移除元素。对于当前状态,只要两头是整个序列的最大值或者最小值,就把它从序列中移除,直到序列空了或者无法拿出。如果存在,显然这就是我们需要的序列的其中一个。

尝试论证:如果序列删完了,那么原来的序列就不存在满足性值的子序列。不妨假设有这个序列 [l, r],那么根据前面提到的性值,l 位置上的数字不是这个子序列的最大值或者最小值,因此也不会是 [l, k] (k >= r - 1) 序列的最大值或者最小值。所以,只要 r - 1 位置上的数字没有被移除,l 位置上的数字也不会被移除。同理,只要 l + 1 位置上的数字没有移除,r 位置上的数字也不会被移除。在两个条件的互锁下,在每次删除序列元素的时候,l 位置上的元素和 r 位置上的元素都不会被删除,和一开始“序列删完了”的条件不符。于是我们证明了上面的命题。 作者:tiger_2005 https://www.bilibili.com/read/cv21786337 出处:bilibili

int A[200010];
int main(){
    multiCase () {
        int N;
        cin >> N;
        readI(1, N, A);
        int l = 1, r = N, L = 1, R = N;
        while (r >= l) {
            if (A[l] == L) {
                ++ l, ++ L;
            }
            else if (A[r] == L) {
                -- r, ++ L;
            }
            else if (A[l] == R) {
                ++ l, -- R;
            }
            else if (A[r] == R) {
                -- r, -- R;
            }
            else
                break;
        }
        if (r >= l)
            printf("%d %d\n", l, r);
        else
            printf("-1\n");
    }
    return 0;
} 

 

posted @ 2023-02-15 14:45  摸鱼选手LLF  阅读(68)  评论(0编辑  收藏  举报