【hihoCoder第十六周】RMQ-ST算法

RMQ的大裸题。没什么意思。开始数组开小了,RE了一次。下面放代码。

 

 1 #include <bits/stdc++.h>

 2 using namespace std;

 3 

 4 vector<int> A;

 5 int dp[1000005][20];

 6 

 7 void RMQ_init () {

 8     int n = A.size();

 9     for (int i = 0; i < n; ++ i) {

10         dp[i][0] = A[i];

11     }

12     for (int j = 1; (1 << j) <= n; ++ j) {

13         for (int i = 0; i + (1 << j) - 1 < n; ++ i) {

14             dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);

15         }

16     }

17 }

18 

19 int RMQ (int L, int R) {

20     int k = 0;

21     while ((1 << (k + 1)) <= R - L + 1) ++ k;

22     return min(dp[L][k], dp[R - (1 << k) + 1][k]);

23 }

24 

25 int main () {

26     int n;

27     while (~scanf ("%d", &n)) {

28         int x, op_n;

29         for (int i = 0 ; i < n; ++ i) {

30             scanf ("%d", &x);

31             A.push_back(x);

32         }

33         /*

34         for (int i = 0; i < A.size() - 1; ++ i) {

35             cout << A[i] << endl;

36         }

37         */

38         RMQ_init ();

39         int a, b;

40         scanf ("%d", &op_n);

41         for (int i = 0; i < op_n; ++ i) {

42             scanf ("%d%d", &a, &b);

43             printf ("%d\n", RMQ(a - 1, b - 1));

44         }

45     }

46     return 0;

47 }

 

你可能感兴趣的:(code)