洛谷P1440 求m区间内的最小值(RMQ/笛卡尔树)

题意:一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。

RMQ代码如下:

#include
#include
#include
#include
#include
using namespace std;
const int maxn=2e6+6;
int dp[maxn][25];
int a[maxn];

void init_dp(int n)
{
	for(int i=1;i<=n;++i)	dp[i][0]=a[i];
	for(int j=1;(1<

然而,用RMQ会MLE(hhhh),所以后面还是得用成笛卡尔树过。
笛卡尔树代码如下:

#include
#include
#include
#include
#include
#include
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
const int maxn=2e6+5;
int a[maxn],n;
int fa[maxn],ls[maxn],rs[maxn];

int build()
{
	stack st;	//存放节点的key值 
	int rt,last;
	for(int i=1;i<=n;++i)
	{
		last=0;
		while(!st.empty())
		{
			if(a[st.top()]r)
		root= root

你可能感兴趣的:(RMQ,数据结构)