【BZOJ】【P2212&P3702】【Poi2011】【Tree Rotations】【二叉树】【题解】【启发式合并】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2212http://www.lydsy.com/JudgeOnline/problem.php?id=3702

启发式合并不解释

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
struct node{  
    int val,key,size,s;  
    node *c[2];  
    node(int _val=0,node *C=0){  
        val=_val;key=rand();  
        size=s=1;c[0]=c[1]=C;  
    }void rz(){  
        size=c[0]->size+s+c[1]->size;  
    }  
};
struct Treap{  
    node *root,*Null;  
    Treap(){  
        Null=new node(0,0);  
        Null->size=Null->s=0;Null->key=INT_MAX;  
        Null->c[0]=Null->c[1]=Null;root=Null;  
    }  
    void rot(node *&t,bool d){  
        node *p=t->c[d];t->c[d]=p->c[!d];  
        p->c[!d]=t;t->rz();p->rz();t=p;  
    }  
    void _insert(node *&t,int x){  
        if(t==Null){t=new node(x,Null);return;}  
        if(t->val==x){t->s++;t->size++;return;}  
        _insert(t->c[x>t->val],x);  
        if(t->c[x>t->val]->key<t->key)  
        rot(t,x>t->val);else t->rz();  
    }  
    int _kth(node *t,int x){  
        int r=t->c[0]->size;  
        if(x<=r)return _kth(t->c[0],x);  
        else if(x>r+t->s) return _kth(t->c[1],x-r-t->s);  
        return t->val;  
    }  
    int _rank(node *t,int x){  
    	if(t==Null)return 0;
        int r=t->c[0]->size;  
        if(x<t->val)return _rank(t->c[0],x);  
        else if(x>t->val)return _rank(t->c[1],x)+r+t->s;  
        return r;  
    }  
    void erase(node *t){
    	if(t->c[0]!=Null)erase(t->c[0]);
    	if(t->c[1]!=Null)erase(t->c[1]);
    	delete t;
    }
    void clear(){erase(root);}
    void insert(int x){_insert(root,x);}  
    int kth(int x){return _kth(root,x);}  
    int rank(int x){return _rank(root,x);}    
    int size(){return root->size;}
}T[maxn];  
typedef long long LL;
int n;
LL cnt[maxn],ans;
int tot=1;
int getint(){
	int res=0;char c=getchar();
	while(!isdigit(c))c=getchar();
	while(isdigit(c))res=res*10+c-'0',c=getchar();
	return res;
}
void dfs(int u){
	int x=getint();
	if(!x){
		int l=++tot,r=++tot;
		dfs(l);
		dfs(r);
		if(T[l].size()<T[r].size())swap(l,r);
		LL res=0;
		for(int i=1;i<=T[r].size();i++)
			res+=T[l].rank(T[r].kth(i));
		ans+=min(res,(LL)T[l].size()*T[r].size()-res);
		for(int i=1;i<=T[r].size();i++){
			int k=T[r].kth(i);
			T[l].insert(k);
		}T[u]=T[l];
	}else T[u].insert(x);	
}
int main(){
	scanf("%d",&n);
	dfs(1);
	cout<<ans<<endl;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值