正题
题目链接:https://www.luogu.com.cn/problem/AT2165
题目大意
nnn行的一个金字塔,第iii层有2×i−12\times i-12×i−1个格子,每个格子是它左右下的中位数。给出最下面的2n−12n-12n−1个数,求第一行的数。
解题思路
我们先二分一个答案,然后变成010101,如果它的下方有两个或以上的就是这个格子的。
找到一个离中间最近的相邻的相同颜色,这个颜色就是答案,因为这两个数顶上连续到中间的都是这个颜色,因为只有另一个连续相同的颜色才能隔开这些颜色,但是如果找到了这两个,那么就有更优的答案案了,所以结论成立。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int n,a[N];
int check(int x){for(int i=1;i<=n;i++){if(a[n-i+1]<x&&a[n-i]<x||a[n+i-1]<x&&a[n+i]<x)return 0;if(a[n-i+1]>=x&&a[n-i]>=x||a[n+i-1]>=x&&a[n+i]>=x)return 1;}return a[1]>=x;
}
int main()
{scanf("%d",&n);for(int i=1;i<=2*n-1;i++)scanf("%d",&a[i]);int l=1,r=2*n;while(l<=r){int mid=(l+r)>>1;if(check(mid))l=mid+1;else r=mid-1;}printf("%d",r);
}