AT2165 Median Pyramid Hard 二分答案 脑洞题

无论再来多少次也不可能想到的写法。

二分一个最小的顶端值\(k\),大于设为\(1\)小于等于设为\(0\),可以猜出来(你跟我说这可以?)如果存在两个连在一起的0/1那么它们会一直往上跑,还可以很容易就想到(容易?????)如果不存在相邻的情况(也就是交叉的那种)那么顶端答案一定是原先左右两边的值之一。。

不管了弃疗了。放代码。

#include <bits/stdc++.h>
using namespace std;

const int N = 200010;

int n, a[N << 1];

int sma (int i, int j, int k) {
    return a[i] <= k && a[j] <= k;
}

int big (int i, int j, int k) {
    return a[i] > k && a[j] > k;
} 

int check (int k) {
    for (int i = 0; i < n - 1; ++i) {//枚举距离判断
        if (big (n + i, n + i + 1, k) || big (n - i, n - i - 1, k)) return 0;
        if (sma (n + i, n + i + 1, k) || sma (n - i, n - i - 1, k)) return 1;
    }
    return sma (1, 1, k);//没有重合的特判
}

int main(){
    cin >> n;
    for (int i = 1; i <= (n << 1) - 1; ++i) {
        cin >> a[i];
    }
    int l = 1, r = 2 * n - 1, ans;
    while (l < r) {//二分判断
        int mid = (l + r) >> 1;
        if (check (mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    cout << r;
    return 0; 
}

posted @ 2019-02-28 16:43  maomao9173  阅读(148)  评论(0编辑  收藏  举报