【AT2165】 Median Pyramid Hard

中文題面:洛谷AT2165

解法:二分搜索

設當前答案爲 x ,原序列爲 {an} 設一個數組 {bn} ,滿足:

{bi=1(aix)bi=0(ai>x)

那麼,如果出現 bi=bi+1 則在金字塔中這條柱子將會一直保持爲 bi=bi+1 不變,金字塔頂的數字與最靠近正中間的柱子的數字相同。;否則這個金字塔將一直爲 0,1 交替,否則金字塔頂的數字與底層奇數位置上的數字相同。(這段中的“數字”均指 b 數組的值)

代碼

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int N,a[200001];
bool b[200001];

bool check(int x){
    for(int i=1;i<=(N<<1)-1;++i)b[i]=(a[i]<=x);
    for(int i=0;i<N;++i){if(b[N-i]==b[N-i-1])return b[N-i];if(b[N+i]==b[N+i+1])return b[N+i];}
    return b[1];
}

int main(){
    scanf("%d",&N);for(int i=1;i<=(N<<1)-1;++i)scanf("%d",a+i);
    int l=1,r=(N<<1)-1,m;
    while(l<r)if(check(m=l+r>>1))r=m;else l=m+1;
    printf("%d",l);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章