首页 > 其他 > 详细

Codeforces 940D

时间:2018-02-26 14:23:42      阅读:313      评论:0      收藏:0      [点我收藏+]

题意略。

这道题目在比赛的时候怎么想也没想明白,后来看了别人的题解才顿悟,可以说很辣鸡了。

只有b[i - 1],b[i - 2],b[i - 3],b[i - 4]相等的时候才能对答案产生限制,否则全部都会成为第三种情况。

那么现在就有00000,00001,11110,11111这4种情况了。

1.00000可知这种状态来源于第三种情况,那么说明第二种状况的第一个条件是错的。

2.00001可知这种状态来源于第二种情况,那么说明第二种状况的两个条件都是对的。

3.11110可知这种状态来源于第一种情况,那么说明第一种情况的两个条件都是对的。

4.11111可知这种状况来源于第三种情况,那么说明第一种情况的第一个条件是错的。

详见代码:

#include<bits/stdc++.h>
#define maxn 100010
#define INF 1e9
using namespace std;

char b[maxn];
int a[maxn];
int l,r,n;

int getmax(int l,int r){
    int ret = -INF;
    for(int i = l;i <= r;++i){
        ret = max(a[i],ret);
    }
    return ret;
}
int getmin(int l,int r){
    int ret = INF;
    for(int i = l;i <= r;++i) ret = min(ret,a[i]);
    return ret;
}

int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;++i) scanf("%d",&a[i]);
    scanf("%s",b + 1);
    l = -INF,r = INF;
    for(int i = 5;i <= n;++i){
        if(b[i - 1] == 0 && b[i - 2] == 0 && b[i - 3] == 0 && 
        b[i - 4] == 0){
            int maxx = getmax(i - 4,i);
            if(b[i] == 0) l = min(l,maxx);
            else l = max(l,maxx + 1);
        }
        else if(b[i - 1] == 1 && b[i - 2] == 1 && b[i - 3] == 1 && 
        b[i - 4] == 1){
            int minn = getmin(i - 4,i);
            if(b[i] == 0) r = min(r,minn - 1);
            else r = max(r,minn);
        }
    }
    printf("%d %d\n",l,r);
    return 0;
}

 

Codeforces 940D

原文:https://www.cnblogs.com/tiberius/p/8472845.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!