codeforce 940D 思维题

传送门:http://codeforces.com/problemset/problem/940/D

题意:

b1 = b2 = b3 = b4 = 0.
For all 5 ≤ i ≤ n:
bi = 0 if ai, ai - 1, ai - 2, ai - 3, ai - 4 > r and bi - 1 = bi - 2 = bi - 3 = bi - 4 = 1
bi = 1 if ai, ai - 1, ai - 2, ai - 3, ai - 4 < l and bi - 1 = bi - 2 = bi - 3 = bi - 4 = 0
bi = bi - 1 otherwise
对于给定的a数组和b数组,找出其中一个l,r使得上述的条件满足。

分析:

对于l,r有约束作用的只有以下的四种情况
(1) bi<=j<=i+4 b i <= j <= i + 4 =00000
(2) bi<=j<=i+4 b i <= j <= i + 4 =00001
(3) bi<=j<=i+4 b i <= j <= i + 4 =11111
(4) bi<=j<=i+4 b i <= j <= i + 4 =11110
对于(1) l<=MAXi<=j<=i+4aj l <= M A X i <= j <= i + 4 a j
对于(2) l>=MAXi<=j<=i+4aj+1 l >= M A X i <= j <= i + 4 a j + 1
对于(3) r>=MINi<=j<=i+4aj r >= M I N i <= j <= i + 4 a j
对于(4) l>=MINi<=j<=i+4aj1 l >= M I N i <= j <= i + 4 a j − 1

代码:

#include <iostream>
#include <bits/stdc++.h>
#define INF 1000000000
using namespace std;

char b[100005];
int a[100005];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%s",b);
    int x=0;         //用于表示前5为数位
    int l=-INF,r=INF;
    for(int i=4;i<n;i++)
    {
        x<<=1;
        x+=b[i]-'0';
        x%=32;
        if(x==0)
        {
            int ma=-INF;
            for(int j=i;j>=i-4;j--)
            {
                ma=max(ma,a[j]);
            }
            l=min(l,ma);
        }else if(x==1){
            int ma=-INF;
            for(int j=i;j>=i-4;j--)
            {
                ma=max(ma,a[j]+1);
            }
            l=max(l,ma);
        }else if(x==31){
            int mi=INF;
            for(int j=i;j>=i-4;j--)
            {
                mi=min(mi,a[j]);
            }
            r=max(r,mi);
        }else if(x==30){
            int mi=INF;
            for(int j=i;j>=i-4;j--)
            {
                mi=min(mi,a[j]-1);
            }
            r=min(r,mi);
        }

    }
    printf("%d %d",l,r);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值