传送门:点击打开链接
D - Median Pyramid Hard
Time limit : 2sec / Memory limit : 256MB
Score : 1300 points
Problem Statement
We have a pyramid with N steps, built with blocks. The steps are numbered 1 through N from top to bottom. For each 1≤i≤N, step i consists of 2i−1 blocks aligned horizontally. The pyramid is built so that the blocks at the centers of the steps are aligned vertically.
![](https://i-blog.csdnimg.cn/blog_migrate/066b28d24b2b252a3c2d04f65b213236.png)
A pyramid with N=4 steps
Snuke wrote a permutation of (1, 2, …, 2N−1) into the blocks of step N. Then, he wrote integers into all remaining blocks, under the following rule:
- The integer written into a block b must be equal to the median of the three integers written into the three blocks directly under b, or to the lower left or lower right of b.
![](https://i-blog.csdnimg.cn/blog_migrate/7068d1a3fa02594ff917272d48bffabf.png)
Writing integers into the blocks
Afterwards, he erased all integers written into the blocks. Now, he only remembers that the permutation written into the blocks of step N was (a1, a2, …, a2N−1).
Find the integer written into the block of step 1.
Constraints
- 2≤N≤105
- (a1, a2, …, a2N−1) is a permutation of (1, 2, …, 2N−1).
Input
The input is given from Standard Input in the following format:
N a1 a2 … a2N−1
Output
Print the integer written into the block of step 1. v
Sample Input 1
4 1 6 3 7 4 5 2
Sample Output 1
4
This case corresponds to the figure in the problem statement.
Sample Input 2
2 1 2 3
Sample Output 2
2
思路:这里 二分答案,转换成01串,两个相连的0和1可以一直往上推,据此二分即可。
# include <stdio.h>
int a[200000+3], n;
bool small(int i, int j, int k) {return a[i]<=k && a[j]<=k;}
bool big(int i, int j, int k) {return a[i]>k && a[j]>k;}
bool judge(int k)
{
for(int i=0; i<n-1; ++i)
{
if(big(n+i, n+i+1, k) || big(n-i, n-i-1, k)) return false;
if(small(n+i, n+i+1, k) || small(n-i, n-i-1, k)) return true;
}
return small(1,1,k);
}
int main()
{
scanf("%d",&n);
for(int i=1; i<n<<1; ++i)
scanf("%d",&a[i]);
int l=1, r=(n<<1)-1, mid;
while(l < r)
{
mid = l+r>>1;
if(judge(mid))
r = mid;
else
l = mid + 1;
}
printf("%d\n",r);
return 0;
}