玲珑oj 1128 RMQ模板

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\n",(LL)RMQ(i+1-B,i,0)*RMQ(i+1-B,i,1));
33     }
34     return 0;
35 }

 

 
posted @ 2017-08-04 10:41  *zzq  阅读(131)  评论(0编辑  收藏  举报