倍增ST表80求助qwq!!

P1440 求m区间内的最小值

旗木五五开 @ 2019-01-31 23:37:21

萌新求助,MLE两点

哪位dalao能帮忙优化一下空间(蟹蟹qwq)

#include <bits/stdc++.h>

#define ll long long
#define mx(x,y) x>y?x:y
#define mn(x,y) x<y?x:y
using namespace std;

inline void r(int &a) {
    char c;
    a=0;
    while((c=getchar())<48);
    while(c>47) a=a*10+c-'0',c=getchar();
}

inline void wr(int x) {
    if(x<0) x=-x,putchar (45);
    if(x<10) {
        putchar (x+48);
        return ;
    }
    wr(x/10);
    putchar (x%10+48);
}

int n,m;
int f[2000005][20],a[2000005];

void init_rmq() {//预处理
    for(int i=1; i<=n; i++)
        f[i][0]=a[i];
    for(int j=1; (1<<j)<=m; j++)
        for(int i=1; i+(1<<j)-1<=n; i++)
            f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}

int query_rmq(int i,int j) {//查询
    int k=(int)(log(double(j-i+1))/log(2.0));
    return min(f[i][k],f[j-(1<<k)+1][k]);
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) scanf("%d",&a[i]);
    init_rmq();
    printf("0\n");
    for(int i=2; i<=n; i++)
        printf("%d\n",query_rmq(max(i-m,1),i-1));
    return 0;
}

by Koakuma @ 2019-01-31 23:52:06

@旗木五五开 ena


by Koakuma @ 2019-01-31 23:54:19

@旗木五五开 不过貌似不行的样子,好吧还是我太蒻了QwQ


by 旗木五五开 @ 2019-01-31 23:55:05

@Koakuma 还是不对诶(哭唧唧qwq)


by Koakuma @ 2019-01-31 23:55:43

@旗木五五开 (严肃) 所以要好好学单调队列呀 qaq


by 旗木五五开 @ 2019-01-31 23:56:41

@Koakuma en。。。


by 旗木五五开 @ 2019-01-31 23:57:19

@Koakuma dalao会滚动数组嘛qwq?


by Koakuma @ 2019-01-31 23:57:28

2e6的数组很少有人敢开得


by Koakuma @ 2019-01-31 23:57:53

@旗木五五开 哦对了,是的可以用滚动数组


by 旗木五五开 @ 2019-01-31 23:58:42

@Koakuma 然鹅我并不会(感觉自己好弱qwq)


by Koakuma @ 2019-01-31 23:59:09

@旗木五五开 还有不要叫我dalao,蒟死了


上一页 | 下一页