题意
给出一个长度为2n-1的排列a[n,1..2n-1],定义a[i,j]=a[i-1,j-1],a[i-1,j],a[i-1,j+1]三个数中的中位数,问a[1,n]的值是多少。
n<=100000
分析
首先可以二分答案,然后把小于mid的数看成0,其余看成1,那么取中位数就变成了取众数。
观察一下性质:
注意到如果最底下一行有两个相邻的0,那么这两列将会全都是0。
然后如果是0和1交叉排列的话,它的长度会越变越小,最后两个01区间交汇在一起,就像下图一样:
然后就可以处理出最后每一段的覆盖范围是多少,就可以知道答案了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>