POJ-2823(ST算法 + 滚动数组)
来源:互联网 发布:喜欢 知乎 编辑:程序博客网 时间:2024/06/07 16:11
ST算法是求解RMQ问题最有效的方法之一,核心思想是以nlogn的复杂度递推f(i, 2^j) = min( f(i, 2^(j-1)), f(i + 2^(j-1), 2^(j-1)) ),其中f(i,2*j)表示arr[i, i + 2*j - 1]这个区间内的最小值
由于本题区间是确知的,所以递推时可以使用滚动数组来实现
#include <stdio.h>#define max(a, b) ((a) > (b) ? (a) : (b))#define min(a, b) ((a) < (b) ? (a) : (b))int n, k;int m[1000000], M[1000000];int main(){ int i, j, t;/* input */ scanf("%d %d", &n, &k); for(i = 0; i < n; ++i){ scanf("%d", &m[i]); M[i] = m[i]; }/* special judge */ if(k == 1){ printf("%d", m[0]); for(i = 1; i < n; ++i) printf(" %d", m[i]); putchar('\n'); printf("%d", m[0]); for(i = 1; i < n; ++i) printf(" %d", m[i]); return 0; }/* create sparse table with rolling array */ k = min(k, n); for(j = 1; (t = j << 1) < k; j = t){ for(i = 0; i + t <= n; ++i){ m[i] = min(m[i], m[i + j]); M[i] = max(M[i], M[i + j]); } }/* print result */ j = k - j; printf("%d", min(m[0], m[j])); for(i = 1; i + k <= n; ++i) printf(" %d", min(m[i], m[i + j])); putchar('\n'); printf("%d", max(M[0], M[j])); for(i = 1; i + k <= n; ++i) printf(" %d", max(M[i], M[i + j])); return 0;}
0 0
- POJ-2823(ST算法 + 滚动数组)
- poj 3264 st算法
- POJ 3264 RMQ--ST 算法
- POJ 3693 Maximum repetition substring(后缀数组+ST)
- hdu4691(后缀数组+ST算法)
- hdu4622(后缀数组+ST算法)
- poj 3264 Balanced Lineup ( ST算法(dp))
- poj 3264RMQ问题(线段树,ST算法)
- 【POJ】3264 - Balanced Lineup(RMQ - ST算法 || 线段树)
- POJ 3264-Balanced Lineup(RMQ-ST算法)
- POJ 2823 Sliding Window (RMQ + 滚动数组)
- poj3264(ST算法)
- RMQ(ST算法)
- LCA(st算法)
- RMQ(ST算法)
- POJ 2184(01背包+滚动数组)
- poj-3661-另一种做法(滚动数组)
- poj - 1036 - Gangsters(滚动数组dp)
- Swap two bits
- 12 在Foreach循环中如何获得当前迭代的索引
- UVa 344 - Roman Digititis
- Linux netfilter 学习笔记 之五 ip层netfilter的table中规则的匹配检查
- 13 在C#中如何获得IP地址
- POJ-2823(ST算法 + 滚动数组)
- OpenAL播放WAV音频文件
- 快速编辑 Shell 命令行
- spring resource通配符
- C#笔记
- 14 在C#中怎样计算年龄
- 15 如何从枚举中获得枚举项名称值
- 解决几个windows访问的问题
- 16 如何使一个文本框只能接受数字