【AT2165】 Median Pyramid Hard

中文题面:洛谷AT2165

解法:二分搜索

设当前答案为 x ,原序列为 { a n } 设一个数组 { b n } ,满足:

{ b i = 1 ( a i x ) b i = 0 ( a i > x )

那么,如果出现 b i = b i + 1 则在金字塔中这条柱子将会一直保持为 b i = b i + 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);
}

猜你喜欢

转载自blog.csdn.net/ezoixx174/article/details/81704094