zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    java占位符应用
    【QuickHit项目实例】
    【那些年关于java多态应用】
    【那些年关于MyEclipse的快捷键大全】
    那些年【深入.NET平台和C#编程】
    关于《网络电视精灵》项目
    VS2013常用快捷键
    关于C#的继承结论
    关于【项目经理评分】项目的代码分析
    序列化和发序列化
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/8470174.html
Copyright © 2011-2022 走看看