Treap80分WA求助
查看原帖
Treap80分WA求助
544571
Locix_Elaina_Celome楼主2023/1/11 11:23

rt,疑似插入有问题,调试时中序遍历输出不递增

#include<iostream>
#include<set>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define int long long
struct ed {
	int l,r,size;
	int val;
	int pr;
	int cnt;
};
#define INF 1145141919
//#define P 100000005
struct treap {
	ed a[1000005];
	void upd(int u) {
		a[u].size=a[a[u].l].size+a[a[u].r].size+a[u].cnt;
	}
	int root,tot;
	void zig(int &u) {
		int v=a[u].l;
		a[u].l=a[v].r;
		a[v].r=u;
		u=v;
		upd(a[u].r);
		upd(u);
	}
	void zag(int &u) {
		int v=a[u].r;
		a[u].r=a[v].l;
		a[v].l=u;
		u=v;
		upd(a[u].l);
		upd(u);
	}
	void insert(int& u,int x) {
		if(x == a[u].val){

			upd(u);
			return ;
		}
		if(u == 0) {
			a[++tot].val=x;
			a[tot].pr=rand();
			a[tot].cnt=1;
			a[tot].size=1;
			u=tot;
			return ;
		}
		if(x<a[u].val) {
			insert(a[u].l,x);
			if(a[u].pr<a[a[u].l].pr)zig(u);
		}
		if(x>a[u].val) {
			insert(a[u].r,x);
			if(a[u].pr<a[a[u].r].pr)zag(u);
		}
		upd(u);
	}
	void build() {
		
		root=1,tot=1;
		a[1].val=INF;
		a[1].size=1;
		a[1].cnt=1;
		a[1].pr=rand();
		insert(root,-INF);
		
	}
	int Find(int p,int x) {
		if(p==0) return 0;
		if(a[p].val==x) return p;
		return a[p].val<x ? Find(a[p].r,x) : Find(a[p].l,x);
	}
	void erase(int& u,int x) {
		if(u == 0) return ;
		if(x == a[u].val) {
			if(a[u].cnt>1) {
				a[u].cnt--;
				upd(u);
				return ;
			}
			if(a[u].l!=0||a[u].r!=0) {
				if(a[a[u].l].pr>a[a[u].r].pr) {
					zig(u);
					erase(a[u].r,x);
				} else {
					zag(u);
					erase(a[u].l,x);
				}
				upd(u);
			} else u=0;
			return ;
		}
		if(x<a[u].val)erase(a[u].l,x);
		if(x>a[u].val)erase(a[u].r,x);
		upd(u);
	}
	int las(int num) {
		int ans=-INF;
		int u=root;
		while(u) {
			if(num == a[u].val) {
				if(a[u].l) {
					u=a[u].l;
					while(a[u].r)u=a[u].r;
					ans=a[u].val;
				}
				break;
			}
			if(a[u].val<num&&a[u].val>ans) {
				ans=a[u].val;
			}
			if(a[u].val<num)u=a[u].r;
			else u=a[u].l;
		}
		return ans;
	}
	int nxt(int num) {
		int ans=INF;
		int u=root;
		while(u) {
			if(num == a[u].val) {
				if(a[u].r) {
					u=a[u].r;
					while(a[u].l)u=a[u].l;
					ans=a[u].val;
				}
				break;
			}
			if(a[u].val>num&&a[u].val<ans) {
				ans=a[u].val;
			}
			if(a[u].val<num)u=a[u].r;
			else u=a[u].l;
		}
		return ans;
	}
	int ask_val(int u,int k) {
//		cout<<u;
		cout<<a[u].val;
		if(a[a[u].l].size+1<=k&&k<=a[a[u].l].size+a[u].cnt) return a[u].val;
		if(k<=a[a[u].l].size)return ask_val(a[u].l,k);
		return ask_val(a[u].l,k-a[a[u].l].size-a[u].cnt);
	}
	int ask_rank(int u,int x) {
		if(u==0) return 0;
		if(x==a[u].val)
			if(x<a[u].val)
				return a[a[u].l].size+1;
		return ask_rank(a[u].l,x);
		return ask_rank(a[u].r,x)+a[a[u].l].size+a[u].cnt;
	}
	
} s;
char c[5];
signed main() {
	srand(time(0)); 
	int n;
	cin>>n;
	s.build();
	int sum;
	cin>>sum;
	s.insert(s.root,sum);
	for(int i=2;i<=n;i++){
		int x;
		cin>>x;
		if(s.Find(s.root,x))continue;
		sum+=min(abs(x-s.las(x)),abs(x-s.nxt(x)));
		s.insert(s.root,x);
	}
	cout<<sum;
}
2023/1/11 11:23
加载中...