[关闭]
@Metralix 2017-04-22T16:43:52.000000Z 字数 692 阅读 758

E - Array Queries

线段树


题目大意

给定一个数组,查询给定区间内的最小值

解题思路

RMQ模板题
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <queue>
  5. #include <map>
  6. #include <vector>
  7. #include <cstring>
  8. #include <cmath>
  9. #include <set>
  10. using namespace std;
  11. const int N = 100100;
  12. int dp[20][N], arr[N];
  13. int cas;
  14. void ST(int n)
  15. {
  16. for(int i = 1; i <= n; i++)
  17. dp[0][i] = arr[i];
  18. for(int i = 1; (1<<i) <= n; i++)
  19. for(int j = 1; j <= n - (1<<i) + 1; j++)
  20. dp[i][j] = min(dp[i-1][j], dp[i-1][j+(1<<(i-1))]);
  21. }
  22. int RMQ(int l, int r)
  23. {
  24. int k = log2(r - l + 1);
  25. return min(dp[k][l], dp[k][r-(1<<k)+1]);
  26. }
  27. int main()
  28. {
  29. int t, n, m, a, b;
  30. scanf("%d", &t);
  31. while(t--)
  32. {
  33. scanf("%d%d", &n, &m);
  34. for(int i = 1; i <= n; i++)
  35. scanf("%d", arr + i);
  36. ST(n);
  37. printf("Case %d:\n", ++cas);
  38. for(int i = 0; i < m; i++)
  39. {
  40. scanf("%d%d", &a, &b);
  41. printf("%d\n", RMQ(a, b));
  42. }
  43. }
  44. return 0;
  45. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注