ST表板子 类似归并的有条理暴力 sparse-table

目录

 ST表部分的代码:

使用示范:


1.原理是“倍增”,直到两个长度为1的就可以合成一个长度为2的,两个2合成4,两个4合成8。

2.最后使用时没必要追求“正好匹配”,可以在范围内取多点:

比如看4~8长度为5(45678),我们取长度为4,看4~7与5~8的最大值哪个更大即可。

 ST表部分的代码:

//ST表
	vector<vector<int>>st(30,vector<int>(n+1));//len = 2的i次方
	int len = 1;
	for (int pow = 0; len <= n; pow++, len *=2)
	{
		for (int left = 1; left <= n- len+1; left++)
		{
			if (pow == 0)
				st[0][left] = arr[left];
			else
			{
				st[pow][left] = max(st[pow - 1][left], st[pow - 1][min(left + len / 2,n)]);
			}
		}
	}

使用示范:

void solve()
{
	int n, m;
	cin >> n >> m;
	vector<int>arr(n+1);
	for (int i = 1; i <= n; i++)
	{
		cin >> arr[i];
	}
	//ST表
	vector<vector<int>>st(30,vector<int>(n+1));//len = 2的i次方
	int len = 1;
	for (int pow = 0; len <= n; pow++, len *=2)
	{
		for (int left = 1; left <= n- len+1; left++)
		{
			if (pow == 0)
				st[0][left] = arr[left];
			else
			{
				st[pow][left] = max(st[pow - 1][left], st[pow - 1][min(left + len / 2,n)]);
			}
		}
	}
	for (int i = 1; i <= m; i++)
	{
		int l, r;
		cin >> l >> r;
		//l+len-1<=r	len = 2的k次方
		//len <= r-l+1
		//k <= log(r-l+1);
		int k = log2(r - l + 1);
		cout << max(st[k][l], st[k][r-pow(2,k)+1]) << endl;
	}
}

相关推荐

  1. ST板子 类似归并条理暴力 sparse-table

    2024-01-30 12:18:03       42 阅读
  2. Lua中数据类型table

    2024-01-30 12:18:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-30 12:18:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-30 12:18:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-30 12:18:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-30 12:18:03       20 阅读

热门阅读

  1. 2024年最新版 在AlmaLinux上安装MongoDB

    2024-01-30 12:18:03       41 阅读
  2. 紫外工业相机的优势与应用

    2024-01-30 12:18:03       38 阅读
  3. 荒原之梦·考研数学:2025 考研每日一题(002)

    2024-01-30 12:18:03       40 阅读
  4. 使用ffmpeg实现服务端和客户端的RTMP推流拉流

    2024-01-30 12:18:03       42 阅读
  5. 多媒体测试资源

    2024-01-30 12:18:03       39 阅读