Loading

【题解】【Atcoder】AGC006D Median Pyramid Hard

AGC006 D Median Pyramid Hard

一个长度为奇数的排列,令b[i]=median(a[i],a[i+1],a[i+2])

median表示中位数

不断执行上述变化序列最终变成一个数,问它是什么

sol

考虑二分最终答案,比它小的设为0,大的设为1

那么三角的状态就是这样:

如果一个地方有连着两个0/1,那么这两个位置就是一个“柱子”——他们的上面都是相同的0/1,而且会往中间靠

那么,我们只需要找到距离中间最近的的柱子,就能确定是0还是1

如果是10交替,那么就是第一个数

code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=200010;

inline void read(int &x) {
    x=0;
    int f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {
        if (ch=='-') {
            f=-1;
        }
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    }
    x*=f;
}

int a[N];
int n;
int ans;

inline bool up(int x,int y,int mid) {
    return a[x]>mid&&a[y]>mid;
}

inline bool down(int x,int y,int mid) {
    return a[x]<=mid&&a[y]<=mid;
}

inline bool check(int mid) {
    for(int i=0;i<n-1;i++) {
        if (up(n-i,n-i-1,mid)||up(n+i,n+i+1,mid)) {
            return 0;
        }
        if (down(n-i,n-i-1,mid)||down(n+i,n+i+1,mid)) {
            return 1;
        }
    }
    return down(1,1,mid);
}

int main() {
    read(n);
    for(int i=1;i<=n*2-1;i++) {
        read(a[i]);
    }
    int l=0,r=n*2-1;
    while(l<=r) {
        int mid=(l+r)>>1;
        if (check(mid)) {
            r=mid-1;
            ans=mid;
        } else {
            l=mid+1;
        }
    }
    printf("%d\n",ans);
    return 0;
}
posted @ 2020-10-17 15:04  tt66ea蒟蒻  阅读(133)  评论(0编辑  收藏  举报