zoukankan      html  css  js  c++  java
  • 【模板】普通平衡树

    【模板】普通平衡树

    平衡树模板

    解析

    虽然是平衡树模板,然而我要写的是权值线段树...
    珍贵的好看的我自己写的标...

    (Code)

    #include<cstdio>
    using namespace std;
    
    const int N = 1e5 + 5 , Len = 2e7 + 10 , V = 1e7 + 1;
    
    struct segment{
    	int num[32 * N] , ls[32 * N] , rs[32 * N] , size;
    	void Size_update(){size = 1;}
    	void New(int p , int x)
    	{
    		if (x == 0 && !ls[p]) ls[p] = ++size;
    		if (x == 1 && !rs[p]) rs[p] = ++size;
    	}
    	void update(int x , int v , int l , int r , int p)
    	{
    		num[p] += v;
    		if (l == r && l == x) return;
    		int mid = (l + r) >> 1;
    		if (x <= mid) New(p , 0) , update(x , v , l , mid , ls[p]);
    		else New(p , 1) , update(x , v , mid + 1 , r , rs[p]);
    	}
    	int findk(int x , int y , int l , int r , int p)
    	{
    		if (x <= l && r <= y) return num[p];
    		int mid = (l + r) >> 1 , res = 0;
    		if (x <= mid && ls[p]) res += findk(x , y , l , mid , ls[p]);
    		if (y > mid && rs[p]) res += findk(x , y , mid + 1 , r , rs[p]);
    		return res;
    	}
    	int kfind(int k , int l , int r , int p)
    	{
    		if (l == r) return l;
    		int mid = (l + r) >> 1;
    		if (num[ls[p]] >= k) return kfind(k , l , mid , ls[p]);
    		else return kfind(k - num[ls[p]] , mid + 1 , r , rs[p]);
    	}
    }seg;
    
    int main()
    {
    	int m , op , x;
    	scanf("%d" , &m);
    	seg.Size_update();
    	for(; m; m--)
    	{
    		scanf("%d%d" , &op , &x);
    		if (op == 1) x += V , seg.update(x , 1 , 1 , Len , 1);
    		else if (op == 2) x += V , seg.update(x , -1 , 1 , Len , 1);
    		else if (op == 3) x += V , printf("%d
    " , seg.findk(1 , x - 1 , 1 , Len , 1) + 1);
    		else if (op == 4) printf("%d
    " , seg.kfind(x , 1 , Len , 1) - V);
    		else if (op == 5) x += V , printf("%d
    " , seg.kfind(seg.findk(1 , x - 1 , 1 , Len , 1) , 1 , Len , 1) - V);
    		else if (op == 6) x += V , printf("%d
    " , seg.kfind(seg.findk(1 , x , 1 , Len , 1) + 1 , 1 , Len , 1) - V);
    	}
    }
    
  • 相关阅读:
    【原创】虚拟机上实现绑定固定IP扩主机容器互访
    docker entrypoint入口文件详解
    数据库博客推荐
    docker下centos安装ping命令
    Dockerfile指令详解
    Elasticsearch Java API 的使用
    docker容器里面安装ssh
    RPM安装命令总结
    Docker容器的跨主机连接
    使用Java程序片段动态生成表格
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/13466214.html
Copyright © 2011-2022 走看看