【AT2165】 Median Pyramid Hard

中文题面:洛谷AT2165

解法:二分搜索

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

{bi=1bi=0(aix)(ai>x) { b i = 1 ( a i ⩽ x ) b i = 0 ( a i > x )

那么,如果出现 bi=bi+1 b i = b i + 1 则在金字塔中这条柱子将会一直保持为 bi=bi+1 b i = b i + 1 不变,金字塔顶的数字与最靠近正中间的柱子的数字相同。;否则这个金字塔将一直为 0,1 0 , 1 交替,否则金字塔顶的数字与底层奇数位置上的数字相同。(这段中的“数字”均指 b b <script type="math/tex" id="MathJax-Element-16">b</script> 数组的值)

代码
#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);
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值