P3369 平衡树板子 Treap求调,58pts

QBW114514 2024-02-24 22:41:34
#include<bits/stdc++.h>
#define f(i,a,b) for(int i = a ; i<=b ; i++)
using namespace std;
const int N = 1e5+5;
int n,rt,op,x;
struct treap{
	int ls,rs;//左孩子,右孩子
	int key;//当前点的值
	int siz,pri;//子树大小,优先级 
}t[N]; 
int cnt;//总结点个数
void newnode(int x){//创建新节点。
    ++cnt;
    t[cnt].ls = t[cnt].rs = 0;
    t[cnt].key = x;
	t[cnt].siz = 1;
    t[cnt].pri = rand();
    return ;
}
#define l t[u].ls 
#define r t[u].rs 
void update(int u){
	t[u].siz = t[l].siz+t[r].siz+1;//合并siz数组 
	return ;
}
void rotate(int &u,int d){
	int k;
	if(!d){
		k = r;
		r = t[k].ls;
		t[k].ls = u;
	}else{
		k = l;
		l = t[k].rs;
		t[k].rs = u;
	}
	t[k].siz+=t[u].siz;//更新
	update(u);//合并siz 
	u = k;//更新u 
	return ; 
}
void insert(int &u,int x){//插入一个节点
    if(!u){//如果当前节点为空...
        newnode(x);//新建节点。
        u = cnt;//设置u。
        return;
    }
    t[u].siz++;//设置当前子树大小自增。
    if(t[u].key<=x){//如果当前节点的键值小于要插入的值...
        insert(r,x);//递归插入。
        if(t[u].pri<t[r].pri) rotate(u,0);//如果权值不满足要求,旋转。
    }
    else{//另一侧...
        insert(l,x);//递归。
        if(t[u].pri<t[l].pri) rotate(u,1);//旋转。
    }
    update(u);
	return; 
}
void del(int &u,int x){//删除元素...
    --t[u].siz;//siz自减。
    if(t[u].key==x){//如果删除的就是当前节点...
        if(!l&&!r){//如果当前节点是叶子...
            u = 0;//删除。
            return;
        }
        if(!l||!r){//如果只有一个子树...
            u = l+r;
            return;
        }
        if(t[l].pri<t[r].pri){//左儿子和右儿子权值...
            rotate(u,1);//旋转。
            del(r,x);//递归。
            return;
        }
        else{
            rotate(u,0);
            del(l,x);
            return;
        }
    }
    if(t[u].key<x) del(r,x);
    else del(l,x);
    update(u);
}
int rank1(int u,int x){
    if(!u) return 0;
    if(x>t[u].key) return t[l].siz+rank1(r,x)+1;
    return rank1(l,x);
}
int kth(int u,int k){
    if(t[l].siz == k-1) return t[u].key;
    else if(t[l].siz<k-1) return kth(r,k-t[l].siz-1);
    else return kth(l,k);
}
int pre(int u,int x){
    if(!u) return 0;
    if(t[u].key>=x) return pre(l,x);
    int tmp = pre(r,x);
    if(!tmp) return t[u].key;
    return tmp;
}
int post(int u,int x){
    if(!u) return 0;
    if(t[u].key<=x) return post(r,x);
    int tmp = post(l,x);
    if(!tmp) return t[u].key;
    return tmp;
}
int main(){
	srand(time(0));
	cin>>n;
	f(i,1,n){
		cin>>op>>x;
		if(op == 1) insert(rt,x);
		if(op == 2) del(rt,x);
		if(op == 3) cout<<rank1(rt,x)+1<<endl;
		if(op == 4) cout<<kth(rt,x)<<endl;
		if(op == 5) cout<<pre(rt,x)<<endl;
		if(op == 6) cout<<post(rt,x)<<endl;
	}
	return 0;
}

 

...全文
491 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文聚焦于高维多阶段随机规划问题,深入研究了正则化分解方法与马尔可夫过程在刻画不确定性动态演化中的应用,并提供了完整的Python代码实现。通过引入正则化技术有效降低了高维随机优化问题的计算复杂度,结合马尔可夫链建模多阶段决策过程中的不确定性传播机制,提升了模型在复杂动态环境下的求解效率与鲁棒性。研究涵盖了问题建模、算法设计、数值求解及结果分析全过程,具有较强的理论深度与工程实践价值; 适合人群:具备一定运筹学、优化理论基础及Python编程能力,从事智能决策、人工智能、能源系统优化、金融工程等相关领域的科研人员、高校研究生以及工业界研发工程师; 使用场景及目标:①应用于电力系统调度、供应链管理、金融资产配置等存在多阶段不确定性的复杂决策场景;②掌握高维随机规划的建模思路与高效求解技术,深入理解正则化方法与马尔可夫过程在实际优化算法中的融合机制与实现路径; 阅读建议:建议结合提供的Python代码进行动手实践,重点关注算法实现细节、参数敏感性分析与收敛性验证,鼓励在不同应用场景中迁移和改进该方法,进一步探索其在分布鲁棒优化、动态规划等前沿方向的扩展潜力。
内容概要:本文系统研究了离散时间线性系统中基于共识的分布式滤波器的稳定性与最优性问题,深入探讨了KF(卡尔曼滤波)、DKF(分布式卡尔曼滤波)、SMDKF(基于平方根的最大熵分布式卡尔曼滤波)、CI(协方差交叉)、ICF(信息共识滤波)和HCMCI(基于高阶交叉协方差的信息融合)等多种滤波算法的理论基础、数学推导与实现机制。通过Matlab平台构建多传感器网络仿真环境,实现了各类算法在不同噪声统计特性和通信拓扑结构下的状态估计仿真,重点分析了各算法在估计精度、收敛速度、鲁棒性及一致性方面的性能差异,并对融合策略中的协方差传播、信息权重分配与共识迭代过程进行了细致对比,旨在为复杂环境下多智能体系统的分布式状态估计提供可复现的技术方案与理论支撑。; 适合人群:具备控制理论、信号处理、线性系统理论及Matlab编程基础的研究生、科研人员,以及从事多传感器融合、分布式估计算法开发、无人系统导航与智能电网监控等领域的工程技术人员。; 使用场景及目标:① 掌握主流分布式滤波算法的核心思想与数学建模方法;② 在多节点传感网络中实现高效可靠的状态估计;③ 对比分析不同共识融合策略在非理想通信条件下的性能表现;④ 支持学术论文复现、算法改进与工程化验证,服务于科研创新与系统优化设计。; 阅读建议:建议结合Matlab代码逐模块解析算法实现流程,重点关注状态预测、局部更新、信息融合与一致性达成的关键步骤;可通过调整系统噪声、观测噪声、网络连接拓扑等参数开展扩展性仿真实验,深入理解算法的稳定边界与最优性条件,进一步探索其在实际应用场景中的适应性与改进空间。

3,094

社区成员

发帖
与我相关
我的任务
社区描述
本社区专注于分享Linux驱动和Kernel源码分析解读
linuxharmonyosubuntu 个人社区 北京·大兴区
社区管理员
  • Coder个人博客
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧