Atcoder [AGC006D] Median Pyramid Hard 题解 [ 紫 ] [ 二分 ] [ adhoc ]
Median Pyramid Hard:二分 trick 加上性质观察题。
trick
我们可以二分值域,然后把大于等于它的数标记成
这道题就是二分塔顶,check 大于等于它的数能不能成为塔顶,把大于等于它的数设为
观察性质
那么这题显然对应着“大小关系只注重两种”的用途,接下来考虑如何 check。
观察到一个位置下面的三个数只可能是这些情况:
0 0 0 => 0
0 0 1 => 0
0 1 0 => 0
0 1 1 => 1
1 0 0 => 0
1 0 1 => 1
1 1 0 => 1
1 1 1 => 1
然后我们手搓样例,继续观察:
sample1:
1
1 1 1
0 1 1 1 0
0 0 1 1 0 1 0
sample2:
1
0 1 1
0 1 0 1 1
0 1 0 1 0 1 1
可以观察到,当
如果有一段区间既不是
可以证明,一定没有一个
1 1 1 * * * 0 0 0
此时星号里必须填入一个
还有一种特殊情况:所有
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
int a[200005],n,f[200005];
bool check(int p)
{
for(int i=1;i<=2*n-1;i++)f[i]=(a[i]>=p);
for(int i=0;i<=n-2;i++)
{
if(f[n-i]==f[n-i-1])return f[n-i];
if(f[n+i]==f[n+i+1])return f[n+i];
}
return f[1];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=2*n-1;i++)cin>>a[i];
int l=1,r=2*n-1,mid;
while(l<r)
{
mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战