• 玲珑学院 1128 咸鱼拷问


    1128 - 咸鱼拷问

    Time Limit:3s Memory Limit:128MByte

    Submissions:367Solved:112

    DESCRIPTION

    给你两个序列A,B。每个序列有N个元素,我们定义第i个位置的咸鱼值为min(A[i],A[i-1]…A[i-B[i]+1])*max(A[i],A[i-1]….A[i-B[i]+1]).。
    现在咸鱼王想知道所有的咸鱼值,于是抓住了你,让你回答这道题。
    你能回答他吗?

    INPUT
    第一行包括一个整数N(1<=N<=1e5) 第二行包括N个整数,表示为A[i] (|A[i]| <= 10^9) 第三行包括N个整数,表示为B[i] ( 1 <= B[i] <= i)
    OUTPUT
    输出N行,第i行表示第i个咸鱼值。
    SAMPLE INPUT
    5
    1 2 3 4 5
    1 2 1 2 3
    SAMPLE OUTPUT
    1
    2
    9
    12
    15RMQ查询区间最值,线段树也可以
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <queue>
    #include <cmath>
    #include <ctime>
    #include <map>
    #include <set>
    using namespace std;
    #define lowbit(x) (x&(-x))
    #define max(x,y) (x>y?x:y)
    #define min(x,y) (x<y?x:y)
    #define MAX 100000000000000000
    #define MOD 1000000007
    #define pi acos(-1.0)
    #define ei exp(1)
    #define PI 3.141592653589793238462
    #define INF 0x3f3f3f3f3f
    #define mem(a) (memset(a,0,sizeof(a)))
    typedef long long ll;
    ll maxx[100006][25],minx[100006][25];
    ll a[100006],b[100006];
    ll n,m,x,y;
    void get_rmq()
    {
        for(int i=1;i<=n;i++)
        {
            maxx[i][0]=a[i];
            minx[i][0]=a[i];
        }
        for(int j=1;(1<<j)<=n;j++)
        {
            for(int i=1;i+(1<<j)-1<=n;i++)
            {
                maxx[i][j]=max(maxx[i][j-1],maxx[i+(1<<(j-1))][j-1]);
                minx[i][j]=min(minx[i][j-1],minx[i+(1<<(j-1))][j-1]);
            }
        }
    }
    ll get_k(ll l,ll r)
    {
        if(l>r) return 0;
        ll k=0;
        while(1<<(1+k)<=r-l+1) k++;
        return k;
    }
    ll rmqmax(ll l,ll r,ll k)
    {
        return max(maxx[l][k],maxx[r-(1<<k)+1][k]);
    }
    ll rmqmin(ll l,ll r,ll k)
    {
        return min(minx[l][k],minx[r-(1<<k)+1][k]);
    }
    int main()
    {
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);
        get_rmq();
        for(int i=1;i<=n;i++)
            scanf("%lld",&b[i]);
        for(int i=1;i<=n;i++)
        {
            ll k=get_k(i-b[i]+1,i);
            printf("%lld
    ",rmqmin(i-b[i]+1,i,k)*rmqmax(i-b[i]+1,i,k));
        }
    }
     
  • 相关阅读:
    SQL 学习笔记<六> MySQL存储过程基础
    SQL 学习笔记<三> SELECT之连接查询
    六、Delphi10.3通过Json.Serializers单元对大量数据序列化
    七、Delphi10.3读取JSON数组
    五、Delphi10.3通过REST单元使类和JSON数据互相转换
    四、Delphi10.3读取JSON数据
    python格式化输出
    python基础知识02
    发送邮件实例
    python基础知识03
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/7219656.html
Copyright © 2020-2023  润新知