1128 - 咸鱼拷问
Time Limit:3s Memory Limit:128MByte
Submissions:380Solved:118
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
SOLUTION
求最值且不需要更新,RMQ能做到 NlogN的预处理 O(1)的查询,直接套模板
注意查询区间为[0,N)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define MAXN ((100000<<2)+15) 5 int A[100015],B; 6 int d[2][100015][20]; 7 void rmq(int n) 8 { 9 for(int i=0;i<n;++i) d[0][i][0]=d[1][i][0]=A[i]; 10 for(int j=1;(1<<j)<=n;++j){ 11 for(int i=0;i+(1<<j)-1<n;++i){ 12 d[0][i][j]=min(d[0][i][j-1],d[0][i+(1<<(j-1))][j-1]); 13 d[1][i][j]=max(d[1][i][j-1],d[1][i+(1<<(j-1))][j-1]); 14 } 15 } 16 } 17 int RMQ(int L,int R,int x) 18 { 19 int k=0; 20 while((1<<(k+1))<=R-L+1) k++; 21 if(x==0) return min(d[0][L][k],d[0][R-(1<<k)+1][k]); 22 else return max(d[1][L][k],d[1][R-(1<<k)+1][k]); 23 } 24 int main() 25 { 26 int t,n,m,i,j,k,opt,l,r,v; 27 scanf("%d",&n); 28 for(i=0;i<n;++i) scanf("%d",&A[i]); 29 rmq(n); 30 for(i=0;i<n;++i) { 31 scanf("%d",&B); 32 printf("%lld ",(LL)RMQ(i+1-B,i,0)*RMQ(i+1-B,i,1)); 33 } 34 return 0; 35 }