求助wa #8 & #11splay解法
查看原帖
求助wa #8 & #11splay解法
879339
Dio_The_World楼主2023/11/4 11:19
#include <bits/stdc++.h>
#define For(i,s,e) for(int i=s;i<=e;i++)
#define dFor(i,s,e) for(int i=s;i>=e;i--)
#define int long long
using namespace std;
#define ls(i) tr[i].s[0]
#define rs(i) tr[i].s[1]
#define p(i) tr[i].p
#define size(i) tr[i].size
#define cnt(i) tr[i].cnt
#define v(i) tr[i].v
const int MaxN=214514;
struct SplayTree{
	struct node{
		int s[2],p,v,cnt,size;
		void init(int p1,int v1){
			p=p1;v=v1;
			cnt=size=1;
		}
	}tr[MaxN];
	int root,idx;
	void push_up(int x){
		size(x)=size(ls(x))+size(rs(x))+cnt(x);
	}
	void rotate(int x){
		int y=p(x),z=p(y);
		bool k=(rs(y)==x);// 0/1 -> l/r
		tr[z].s[(rs(z)==y)]=x;
		p(x)=z;
		//z--x
		tr[y].s[k]=tr[x].s[k^1];
		p(tr[x].s[k^1])=y;
		//y--xs
		tr[x].s[k^1]=y;
		p(y)=x;
		//x--y
		push_up(y),push_up(x);
	}
	void splay(int x,int k){
		while(p(x)!=k){
			int y=p(x),z=p(y);
			if(z!=k)(ls(y)==x)^(ls(z)==y)?rotate(x):rotate(y);
			rotate(x);
		}
		if(!k)root=x;
	}
	void find(int v){
		int x=root;
		while(tr[x].s[(v>v(x))] && v!=v(x))
			x=tr[x].s[v>v(x)];//<sm0 , bg1>
		splay(x,0);
	}
	int get_(int v,bool f){//f-> 1:pre(front)
		find(v);		  // f-> 0:suc(back)
		int x=root;
		if(f&&v(x)<v || !f&&v(x)>v)return x;
		x=tr[x].s[f^1];
		while(tr[x].s[f])x=tr[x].s[f];
		return x;
	}
	int get_pre(int v){return v(get_(v,1));}
	int get_suc(int v){return v(get_(v,0));}
	bool insert(int v){
		int x=root,p=0,f=0;
		while(x && v(x)!=v)
			p=x,x=tr[x].s[v>v(x)];
		if(x)cnt(x)++,f=1;
		else{
			x=++idx;
			if(p)tr[p].s[v>v(p)]=x;
			tr[x].init(p,v);
		}
		splay(x,0);
		return f;
	}
	void del(int v){
		int pre=get_(v,1),suc=get_(v,0);
		splay(pre,0),splay(suc,pre);
		int del=ls(suc);
		if(cnt(del)>1)cnt(del)--,splay(del,0);
		else ls(suc)=0,splay(suc,0);
	}
	int get_rank(int v){
		insert(v);
		int res=size(ls(root));//sentry
		del(v);
		return res;
	}
	int get_val(int k){
		int x=root;k++;
		while(1){
			int y=ls(x);
			if(size(y)+cnt(x)<k){
				k-=size(y)+cnt(x);
				x=rs(x);
			}else{
				if(size(y)>=k)x=ls(x);
				else break;
			}
		}
		splay(x,0);
		return v(x);
	}
	int st1=insert(-1<<30),st2=insert(1<<30);
}tree;
int a[MaxN],u[MaxN];
signed main(){
	int n,m;
	scanf("%lld%lld",&n,&m);
	For(i,1,n)scanf("%lld",a+i);
	For(i,1,m)scanf("%lld",u+i);
	int j=0;
	For(i,1,n){
		tree.insert(a[i]);
		while(u[j+1]==i){
			int k=tree.get_val(++j);
			printf("%lld\n",k);
		}
	}
}
2023/11/4 11:19
加载中...