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
",ans);
return 0;
}