CodeForces - 1350D Orac and Medians (构造)

🦊 🦊 🦊

题意

每次可选择一段区间,使该段区间等于区间中位数,该操作可进行任意次,问你有没有可能使整段区间等于k

分析

(1)n =1 时,需满足a = k;
(2)n = 2时,需满足两数之中有一个为k且另一个大于等于k;
(3)n > 2时,如果存在子区间满足(2),则该区间也满足
(4)考虑如何构造出一个满足(2)的区间,对于长度>2的区间,只要存在长为3的子区间满足有两个>=k且整段区间存在k,则该区间可构造出(2),因为我们每次从长为3的该段区间开始,使该段区间全部<=k后,向左右两边延展,延展到区间等于k的位置时,即构造成功
(5)代码做了简化,没有单独考虑n = 2

代码

int a[MX];
void solve()
{
    int n,k;cin >> n>>k;
    rpp(i, n) cin >> a[i];
    if(n==1) cout<<(a[1]==k?"yes":"no")<<endl;
    else 
    {
        int flag=0;
        rpp(i,n) if(a[i]==k) flag=1;
        if(flag==0) cout<<"no\n";
        else 
        {
            rpp(i,n)
            {
                int num=0;
                rep(j,3) if(a[i+j]>=k) ++num;
                if(num>=2)
                {
                    cout<<"yes\n";
                    return;
                }
            }
            cout<<"no\n";
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值