ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

笛卡尔树

2022-04-12 17:00:06  阅读:135  来源: 互联网

标签:ch 笛卡尔 void while gc inline define


笛卡尔树

定义

同时满足堆和二叉搜索树的性质。即对于每个节点有两个键值 \(w,k\) 。其中 \(w\) 满足堆的性质,而 \(k\) 满足二叉搜索树的性质。

构造

我们把点按照 \(k\) 排序,那么我们新加入的点直接往右链放即可。因此我们用栈维护这个过程。

具体来说栈维护右链,且内部元素的 \(w\) 值非严格单调递增。如果当前新打算加入的元素的 \(w\) 比栈顶小,那么一直弹栈。弹不了了就直接把当前点往右链上接。被弹出的部分接在新加入的点的左子树即可。其实是比较自然的。

#include<bits/stdc++.h>
#define ll long long
#define db double
#define filein(a) freopen(#a".in","r",stdin)
#define fileot(a) freopen(#a".out","w",stdout)
#define sky fflush(stdout);
#define gc getchar
#define pc putchar
namespace IO{
	inline bool blank(const char &c){
		return c==' ' or c=='\n' or c=='\t' or c=='\r' or c==EOF;
	}
	inline void gs(char *s){
		char ch=gc();
		while(blank(ch) ) {ch=gc();}
		while(!blank(ch) ) {*s++=ch;ch=gc();}
		*s=0;
	}
	inline void gs(std::string &s){
		char ch=gc();s+='#';
		while(blank(ch) ) {ch=gc();}
		while(!blank(ch) ) {s+=ch;ch=gc();}
	}
	inline void ps(char *s){
		while(*s!=0) pc(*s++);
	}
	inline void ps(const std::string &s){
		for(auto it:s) 
			if(it!='#') pc(it);
	}
	template<class T>
	inline void read(T &s){
		s=0;char ch=gc();bool f=0;
		while(ch<'0'||'9'<ch) {if(ch=='-') f=1;ch=gc();}
		while('0'<=ch&&ch<='9') {s=s*10+(ch^48);ch=gc();}
		if(ch=='.'){
			db p=0.1;ch=gc();
			while('0'<=ch&&ch<='9') {s=s+p*(ch^48);p*=0.1;ch=gc();}
		}
		s=f?-s:s;
	}
	template<class T,class ...A>
	inline void read(T &s,A &...a){
		read(s);read(a...);
	}
};
using IO::read;
using IO::gs;
using IO::ps;
const int N=1e7+3;
int n;
struct node{
	int w,k;
	int lc,rc;
}t[N];
int stk[N],top;
inline void build(){
	top=0;
	for(int i=1;i<=n;++i){
		int k=top;
		while(k and t[stk[k] ].w>t[i].w)
			--k;
		if(k) t[stk[k] ].rc=i;
		if(k<top) t[i].lc=stk[k+1];
		stk[++k]=i;
		top=k;
	}
}
int main(){
	//filein(a);fileot(a);
	read(n);
	for(int i=1;i<=n;++i){
		read(t[i].w);
		t[i].k=i;
	}
	build();
	ll ans1=0,ans2=0;
	for(int i=1;i<=n;++i){
		ans1^=1ll*i*(t[i].lc+1);
		ans2^=1ll*i*(t[i].rc+1);
	}
	printf("%lld %lld\n",ans1,ans2);
	return 0;
}

标签:ch,笛卡尔,void,while,gc,inline,define
来源: https://www.cnblogs.com/cbdsopa/p/16135939.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有