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