• 940D Alena And The Heater


    传送门

    题目大意

    给出两个长度为N的数组A,B,以及一种计算规律:
    若t[i]=1,需满足t[i-1]=t[i-2]=t[i-3]=t[i-4]=0,以及max{A[i],A[i-1],A[i-2],A[i-3],A[i-4]} < l
    若t[i]=0,需满足t[i-1]=t[i-2]=t[i-3]=t[i-4]=1,以及min{A[i],A[i-1],A[i-2],A[i-3],A[i-4]} > r
    其他情况:t[i]=t[i-1]|l|,|r|109
    现在要使得运算一次的结果t=B,求满足条件的l,r(保证有解)
    N≤100000

    分析

    由于l,r多解,所以我们不妨将l和r分别设为它们的极限-1e9和1e9,然后从B的第5为开始查找,由于数组可以向后传递,所以我们只需寻找与前一位相异的即可,找到后有两种情况:

        1.t[i]=1,则l=max(l,max{A[i],A[i-1],A[i-2],A[i-3],A[i-4]}+1)

        2.t[i]=0,则r=min(r,min{A[i],A[i-1],A[i-2],A[i-3],A[i-4]}-1)

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int a[110000],b[110000];
    char s[110000];
    int main()
    {     int n,m,i,j,k,le=-1e9,ri=1e9;
          cin>>n;
          for(i=1;i<=n;i++){
              scanf("%d",&a[i]);
          }
          scanf("%s",s+1);
          for(i=1;i<=n;i++)
             b[i]=s[i]-'0';
          int be=0;
          for(i=5;i<=n;i++)
             if(b[i]!=be){
                 if(b[i]==1)
                   le=max(le,max(a[i]+1,max(a[i-1]+1,max(a[i-2]+1,max(a[i-3]+1,a[i-4]+1)))));
                   else
                     ri=min(ri,min(a[i]-1,min(a[i-1]-1,min(a[i-2]-1,min(a[i-3]-1,a[i-4]-1)))));
                 be=b[i];
                 }
          cout<<le<<' '<<ri<<endl;
          return 0;
    }

  • 相关阅读:
    django之上传
    djano的ORM操作
    Python中的分页管理
    MySQL作业
    socket操作
    python的os模块
    django-debug-toolbar的配置及使用
    logging模板及配置说明
    使用StrictRedis连接操作有序集合
    学习总结
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/8470174.html
Copyright © 2020-2023  润新知