zoukankan      html  css  js  c++  java
  • hihoCoder#1070 RMQ问题再临

    原题地址

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

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

    超时的ST代码:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 #define MAX_NODE 10008
     6 
     7 int N, Q;
     8 int st[MAX_NODE][32];
     9 
    10 void build() {
    11   for (int j = 1; (1 << j) <= N; j++)
    12     for (int i = 0; i + (1 << j) <= N; i++)
    13       st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
    14 }
    15 
    16 int query(int l, int r) {
    17   int len = r - l + 1;
    18   int i = 0;
    19   while ((1 << (i + 1)) <= len)
    20     i++;
    21   return min(st[l][i], st[r - (1 << i) + 1][i]);
    22 }
    23 
    24 void update(int p, int v) {
    25   st[p][0] = v;
    26   for (int j = 1; p + (1 << j) - 1 <= N || p - (1 << j) + 1 >= 0; j++)
    27     for (int i = max(p - (1 << j) + 1, 0); i + (1 << j) - 1 <= N; i++) {
    28       st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
    29     }
    30 }
    31 
    32 int main() {
    33   scanf("%d", &N);
    34   for (int i = 0; i < N; i++)
    35     scanf("%d", &(st[i][0]));
    36 
    37   build();
    38 
    39   scanf("%d", &Q);
    40   while (Q--) {
    41     int t, a, b;
    42     scanf("%d%d%d", &t, &a, &b);
    43     if (!t)
    44       printf("%d
    ", query(a - 1, b - 1));
    45     else
    46       update(a - 1, b);
    47   }
    48 
    49   return 0;
    50 }

    Naive代码:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 #define MAX_NODE 10008
     6 
     7 int N, Q;
     8 int w[MAX_NODE];
     9 
    10 int query(int l, int r) {
    11   int res = w[l];
    12   for (int i = l; i <= r; i++) {
    13     res = min(res, w[i]);
    14   }
    15   return res;
    16 }
    17 
    18 void update(int p, int v) {
    19   w[p] = v;
    20 }
    21 
    22 int main() {
    23   scanf("%d", &N);
    24   for (int i = 0; i < N; i++)
    25     scanf("%d", &(w[i]));
    26 
    27   scanf("%d", &Q);
    28   while (Q--) {
    29     int t, a, b;
    30     scanf("%d%d%d", &t, &a, &b);
    31     if (!t)
    32       printf("%d
    ", query(a - 1, b - 1));
    33     else
    34       update(a - 1, b);
    35   }
    36 }
  • 相关阅读:
    10-JS的函数学习
    Servlet(生命周期)
    09-js数组常用方法
    08-计算器案例
    07-js数组
    06-js的逻辑结构
    使用css设置三角形
    关于background-size 的一点小坑
    a 标签实现分享功能
    关于页面缩放时css错乱的处理方法---之一
  • 原文地址:https://www.cnblogs.com/boring09/p/4383795.html
Copyright © 2011-2022 走看看