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; }