题目连接:G -- 咸鱼拷问
G -- 咸鱼拷问
Time Limit:3s Memory Limit:128MByte
Submissions:366Solved:111
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
15
题目分析:RMQ求区间最值,模板题
//
// main.cpp
// G -- 咸鱼拷问
//
// Created by teddywang on 2017/5/30.
// Copyright © 2017年 teddywang. All rights reserved.
//
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll s[400010];
ll t[400010];
ll idx[400090];
ll idy[400010];
ll n;
ll lowbit(ll x)
{
return x&(-x);
}
void init()
{
for(int i=1;i<=n;i++)
{
idx[i]=s[i];
idy[i]=s[i];
for(int j=1;j<lowbit(i);j<<=1)
{
idx[i]=min(idx[i],idx[i-j]);
idy[i]=max(idy[i],idy[i-j]);
}
}
}
ll querymin(int l,int r)
{
ll ans=s[r];
while(1)
{
ans=min(ans,s[r]);
if(l==r) break;
for(r-=1;r-l>=lowbit(r);r-=lowbit(r))
ans=min(ans,idx[r]);
}
return ans;
}
ll querymax(int l,int r)
{
ll ans=s[r];
while(1)
{
ans=max(ans,s[r]);
if(l==r) break;
for(r-=1;r-l>=lowbit(r);r-=lowbit(r))
ans=max(ans,idy[r]);
}
return ans;
}
int main()
{
while(~scanf("%lld",&n))
{
memset(idx,0,sizeof(idx));
memset(idy,0,sizeof(idy));
for(int i=1;i<=n;i++)
{
scanf("%lld",&s[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&t[i]);
}
init();
for(int i=1;i<=n;i++)
{
int l=i-t[i]+1;
int r=i;
//cout<<l<<" "<<r<<endl;
ll maxn=querymax(l,r);
ll minn=querymin(l,r);
ll ans=maxn*minn;
printf("%lld\n",ans);
}
}
}