Atcoder AGC006D : Median Pyramid Hard

传送门

题解:
二分最终答案,然后转化为0,1串。
发现连续的0,1串每次往左右扩展1,那么我们找到距离中点最近的即可。

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

const int RLEN=1<<18|1;
inline char nc() {
    static char ibuf[RLEN],*ib,*ob;
    (ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
    return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
    char ch=nc(); int i=0,f=1;
    while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}
    while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
    return i*f;
}

const int N=2e5+50;
int n,a[N];
#define up(i,j) ((a[i]>=v) && (a[j]>=v))
#define dn(i,j) ((a[i]<v) && (a[j]<v))
inline bool check(int v) {
    for(int i=0;i<n-1;i++) {
        if(up(n+i,n+i+1) || up(n-i,n-i-1)) return 1;
        if(dn(n+i,n+i+1) || dn(n-i,n-i-1)) return 0;
    } return up(1,1);
}
int main() {
    n=rd(); for(int i=1;i<n*2;++i) a[i]=rd();
    int l=1, r=*max_element(a+1,a+2*n), ans=0;
    while(l<=r) {
        int mid=(l+r)>>1;
        if(check(mid)) ans=mid, l=mid+1;
        else r=mid-1;
    } cout<<ans<<'\n';
}

猜你喜欢

转载自blog.csdn.net/qq_35649707/article/details/80683768
今日推荐