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;
    }

  • 相关阅读:
    c语言指针讲解第一节初识指针
    linux的的一些入门常识
    sql手注的思路
    mysql主从备份配置
    CentOS 6.5 nginx+tomcat+ssl配置
    mysql 5.7.18安装教程
    minIO分布式集群搭建+nginx负载均衡
    Linux常用命令
    使用python连接mysql数据库——pymysql模块的使用
    with与上下文管理器
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/8470174.html
Copyright © 2011-2022 走看看