首页 > 代码库 > 玲珑学院 1128 咸鱼拷问

玲珑学院 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\n",rmqmin(i-b[i]+1,i,k)*rmqmax(i-b[i]+1,i,k));
    }
}

 

 

玲珑学院 1128 咸鱼拷问