玲珑学院 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)); } }