ST表
ST表
主要就是解决RMQ的问题,其预处理的时间复杂度和线段树一样都是o(nlogn),但是在查询方面,线段树是o(mlogn),而ST表可以做到o(1),适用于时间卡得比较死的RMQ问题。
ST表不支持单点修改和区间修改操作,属于离线表。
一下是ST表预处理代码:
int dp[N][33];//第一维表示N个数,第二维表示2^n次方个数的区间长度 int n, m; n = read(), m = read(); for (int i = 1; i <= n; i++)dp[i][0] = read();//2^0为1,区间长度为每个数本身 for (int i = 1; i <= 20; i++)//预处理 for (int j = 1; j + (1 << i) - 1 <= n; j++)//j+(1<<i)-1为最大区间个数 //j为区间最左端,(1<<i)为区间个数,-1表示将左边的j也纳入区间 dp[j][i] = max(dp[j][i - 1], dp[j + (1 << (i - 1))][i - 1]); //2^i个数中的最大/小值是分别从两个长度2^(i-1)中的各自的最大/小进行比较的
以下是ST表区间查询代码:
while (m--) { int l, r; l = read(), r = read(); int mid = log2(r - l + 1);//找到区间的个数以及对应的2的幂次数 cout << max(dp[l][mid], dp[r - (1 << mid) + 1][mid]) << endl; //r表示区间右端,(1<<mid)表示区间个数,+1是将左端点r也算入式子 }

浙公网安备 33010602011771号