其他分享
首页 > 其他分享> > dls的数据结构-笛卡尔树,st表,带权并查集

dls的数据结构-笛卡尔树,st表,带权并查集

作者:互联网

笛卡尔树





#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 1e6+10;

int ans[N], tot;



// a存放原序列,top从0开始,右边闭区间
// 建立区间最小值笛卡尔树
// 根节点是stk[1]
int stk[N], top, a[N], l[N], r[N];
int n;

void dfs(int u){
	ans[u] = ++tot;
	if(l[u]) dfs(l[u]);
	if(r[u]) dfs(r[u]);
}
void build(){
	int top = 0;
	for(int i = 1; i <= n; i ++) l[i] = r[i] = 0;
	for(int i = 1; i <= n; i ++){
		int k = top;
		while(k > 0 && a[stk[k]] > a[i] ) k--;
		if(k) r[stk[k]] = i;
		if(k < top) l[i] = stk[k + 1];
		stk[++k] = i;
		top = k; 
	}
	// 把树建出来
	// for(int i = 1; i <= n; i ++){
	// 	if(l[i]) add(i, l[i]);
	// 	if(r[i]) add(i, r[i]);
	// }
	dfs(stk[1]);
}

int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
	build();
	for(int  i = 1; i <= n; i ++) printf("%d ", ans[i]);
	puts("");
 	return 0;
}






标签:笛卡尔,int,top,查集,dfs,stk,dls,tot,st
来源: https://www.cnblogs.com/njw1123/p/16144059.html