zoukankan      html  css  js  c++  java
  • Jzoj3901 二叉查找树

    题意:给你一个bst插入的顺序问你完成这些操作需要多少次比较(即这颗bst所有节点深度之和)

    显然,我们在bst中插入一个节点x,它一定是它前继或者后续的儿子

    这样的话,我们记录每个点的深度,每次找前继和后续即可

    本来应该用链表的,我还是为了卡时用了ZKW线段树

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 300010
    using namespace std;
    int s[N<<2],d[N],n,M; long long A=0;
    inline void add(int x){ for(x+=M;x;x>>=1) ++s[x]; }
    inline int pre(int x){
    	for(x+=M;x;x>>=1)
    		if((x&1)&&(s[x^1])){
    			for(--x;x<=M;x=(s[x<<1|1]?x<<1|1:x<<1));
    			return x-M;
    		}
    	return 0;
    }
    inline int suc(int x){
    	for(x+=M;x;x>>=1)
    		if((~x&1)&&(s[x^1])){
    			for(++x;x<=M;x=(s[x<<1]?x<<1:x<<1|1));
    			return x-M;
    		}
    	return 0;
    }
    int main(){
    	scanf("%d",&n);
    	for(M=1;M<n;M<<=1); --M;
    	for(int x,i=0;i<n;++i){
    		scanf("%d",&x); add(x);
    		d[x]=max(d[pre(x)],d[suc(x)])+1;
    		printf("%lld
    ",A+=d[x]-1);
    	}
    }

  • 相关阅读:
    第一阶段各队建议
    解决死锁四大方式
    进程和线程区别
    windows 地址空间分配
    Linux下用户组、文件权限详解
    2016总结
    class内部处理
    c++ devived object model
    static
    reinterpret
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477336.html
Copyright © 2011-2022 走看看