您的位置:首页 > 其它

hihoCoder#1070 RMQ问题再临

2015-04-01 14:39 239 查看
原题地址

模拟题,naive算法即可过,想着顺便练习一下ST吧,结果还超时了。。。

看来ST真不适合处理动态修改的问题,连naive算法的效率都不如。

超时的ST代码:

#include <iostream>

using namespace std;

#define MAX_NODE 10008

int N, Q;
int st[MAX_NODE][32];

void build() {
for (int j = 1; (1 << j) <= N; j++)
for (int i = 0; i + (1 << j) <= N; i++)
st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}

int query(int l, int r) {
int len = r - l + 1;
int i = 0;
while ((1 << (i + 1)) <= len)
i++;
return min(st[l][i], st[r - (1 << i) + 1][i]);
}

void update(int p, int v) {
st[p][0] = v;
for (int j = 1; p + (1 << j) - 1 <= N || p - (1 << j) + 1 >= 0; j++)
for (int i = max(p - (1 << j) + 1, 0); i + (1 << j) - 1 <= N; i++) {
st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
}

int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d", &(st[i][0]));

build();

scanf("%d", &Q);
while (Q--) {
int t, a, b;
scanf("%d%d%d", &t, &a, &b);
if (!t)
printf("%d\n", query(a - 1, b - 1));
else
update(a - 1, b);
}

return 0;
}


Naive代码:

#include <iostream>

using namespace std;

#define MAX_NODE 10008

int N, Q;
int w[MAX_NODE];

int query(int l, int r) {
int res = w[l];
for (int i = l; i <= r; i++) {
res = min(res, w[i]);
}
return res;
}

void update(int p, int v) {
w[p] = v;
}

int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d", &(w[i]));

scanf("%d", &Q);
while (Q--) {
int t, a, b;
scanf("%d%d%d", &t, &a, &b);
if (!t)
printf("%d\n", query(a - 1, b - 1));
else
update(a - 1, b);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: