求大佬帮帮忙,替罪羊树,普通平衡树,5-10的测试数据过不了awa
查看原帖
求大佬帮帮忙,替罪羊树,普通平衡树,5-10的测试数据过不了awa
685127
MaLX楼主2022/3/21 17:55
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int ni=2e6;
#define l c[0]
#define r c[1]
struct node{int c[2],val,siz,sum,cnt;double dep;}tr[ni];
double alf=0.7;int remake(int a);
int stk[ni],top,dfs(int a,int b);
void solve(),pushup(int b),dfs(int a);
int tool(int a,int b),took(int a,int b);
int toor(int a,int b),tonk(int a,int b);
int push(int a,int b),delt(int a,int b);
int root,n,tot,num,mun,tonode(int a);
int main(){solve();return 0;}
void print(int a);
void solve(){
	scanf("%d",&n);
	for(int j=1;j<=n;j++){
		int o,a;scanf("%d%d",&o,&a);
		// printf("___%d___\n",j);
		switch(o){
			case 1:root=push(root,a);break;
			case 2:root=delt(root,a);break;
			case 3:tr[0]={0};printf("%d\n",took(root,a));break;
			case 4:tr[0]={0};printf("%d\n",tonk(root,a));break;
			case 5:tr[0]={0};printf("%d\n",tool(root,a));break;
			case 6:tr[0]={0};printf("%d\n",toor(root,a));break;
		}
		// print(root);
	}
}
void print(int a){
	// printf("[%d]\n",a);
	for(int i=0;i<=1;i++)if(tr[a].c[i])
	printf("[ %d -- %d -> %d ]\n",a,i,tr[a].c[i]),print(tr[a].c[i]);
}
void dfs(int a){
	if(!a)return ;
	dfs(tr[a].l);stk[++top]=a;dfs(tr[a].r);
	tr[a].l=tr[a].r=0;tr[a].dep=1;
	tr[a].siz=1;tr[a].sum=tr[a].cnt;
}
int dfs(int li,int ri){
	if(li>ri)return 0;
	int mid=(li+ri)/2;node &t=tr[stk[mid]];
	t.l=dfs(li,mid-1),t.r=dfs(mid+1,ri);
	pushup(stk[mid]);return stk[mid];
}
int remake(int a){top=0;dfs(a);return dfs(1,top);}
int push(int u,int a){
	node &t=tr[u];if(u==0)return tonode(a);
	if(t.val==a){t.cnt++;pushup(u);return u;}
	t.val>a?t.l=push(t.l,a):t.r=push(t.r,a);
	if((tr[t.r].dep&&tr[t.l].dep/tr[t.r].dep<=alf)||
	(tr[t.l].dep&&tr[t.r].dep/tr[t.l].dep<=alf))u=remake(u);
	pushup(u);return u;
}
int delt(int u,int a){
	node &t=tr[u];if(u==0)return 0;
	if(t.val==a){
		t.cnt--;if(t.cnt){pushup(u);return u;}
		num--;if(t.l==0||t.r==0)return t.l+t.r;
	}
	t.val>a?t.l=delt(t.l,a):t.r=delt(t.r,a);
	pushup(u);return u;
}
int took(int u,int a){
	node &t=tr[u];if(u==0)return 0;
	if(t.val==a)return tr[t.l].sum+1;
	return t.val>a?took(t.l,a):
	took(t.r,a)+tr[t.l].sum+t.cnt;
}
int tonk(int u,int a){
	node &t=tr[u];if(u==0)return 0;
	int c[2];l=tr[t.l].sum;r=l+t.cnt;
	// printf("(%d %d %d)\n",a,l,r);
	if(a>l&&a<=r)return t.val;
	return a<=l?tonk(t.l,a):tonk(t.r,a-r);
}
int tool(int u,int a){
	// return tonk(root,took(root,a)-1);
	node &t=tr[u];if(u==0)return -0x3f3f3f3f;
	if(t.val>=a)return tool(t.l,a);
	return max(tool(t.r,a),t.cnt?t.val:-0x3f3f3f3f);
}
int toor(int u,int a){
	// return tonk(root,took(root,a)+1);
	node &t=tr[u];if(u==0)return 0x3f3f3f3f;
	if(t.val<=a)return toor(t.r,a);
	return min(toor(t.l,a),t.cnt?t.val:0x3f3f3f3f);
}
int tonode(int a){
	tot++;tr[tot].siz=tr[tot].sum=tr[tot].cnt=1;
	tr[tot].val=a;tr[tot].dep=1;
	num++;mun=max(num,mun);return tot;
}
void pushup(int a){
	tr[0]={0};tr[a].siz=tr[tr[a].l].siz+tr[tr[a].r].siz+1;
	tr[a].sum=tr[tr[a].l].sum+tr[tr[a].r].sum+tr[a].cnt;
	tr[a].dep=max(tr[tr[a].l].dep,tr[tr[a].r].dep)+1;
}
2022/3/21 17:55
加载中...