• 玲珑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
    ",(LL)RMQ(i+1-B,i,0)*RMQ(i+1-B,i,1));
    33     }
    34     return 0;
    35 }
     
  • 相关阅读:
    PHP添加Redis模块及连接
    Redis高级应用
    Redis常用命令
    Redis的数据类型及操作
    Redis下载及安装部署
    NoSQL介绍
    8种Nosql数据库系统对比
    JQ插件
    libcurl一般用法
    密钥对加密原理
  • 原文地址:https://www.cnblogs.com/zzqc/p/7283735.html
Copyright © 2020-2023  润新知