【洛谷P1486】郁闷的出纳员【Treap】

状态估计【卡尔曼滤波kalman】UKF、EKF、粒子滤波PF学习与研究(Matlab代码实现) 内容概要:本文围绕非线性状态估计中的三种经典滤波算法——无迹卡尔曼滤波(UKF)、扩展卡尔曼滤波(EKF)和粒子滤波(PF)展开系统性学习与研究,重点在于通过Matlab编程实现这些算法的核心流程,并将其应用于实际系统的状态估计问题中。文档不仅详细阐述了各算法的数学原理、适用条件与性能差异,还提供了完整的仿真代码与案例分析,帮助读者深入理解其在非线性、非高斯环境下的表现特性。同时,资源拓展至EKF与神经网络融合训练、多源数据融合等高级应用场景,展现了其在智能控制、无人机导航、电力系统状态估计、目标跟踪等领域的广泛应用价值。; 适合人群:具备一定信号处理、控制理论或状态估计基础的研究生、科研人员及工程技术人员,尤其适用于从事自动化、机器人、导航、电力电子与智能系统等相关方向的研究与开发工作者;; 使用场景及目标:① 掌握UKF、EKF与PF在非线性系统中的建模思路与Matlab实现方法,理解其优缺点与适用边界;② 提升科研仿真能力,能够独立构建状态估计模型并进行算法对比验证;③ 将所学方法应用于如电池SOC估算、无人机姿态估计、传感器融合、故障诊断等实际工程问题中;; 阅读建议:建议结合Matlab动手实践,逐行解读并调试所提供的代码,深入理解算法实现细节;同时可延伸学习文中提及的数据融合、神经网络与滤波器结合等进阶主题,以构建完整的状态估计技术知识体系。 立即下载

题目大意:

题目链接:https://www.luogu.org/problem/P1486
你需要维护一下四个操作:

  • I   k I\ k I k:插入一个数字 k k k
  • A   k A\ k A k:将所有数字增加 k k k
  • S   k S\ k S k:将所有数字减去 k k k
  • F   k F\ k F k:查询第 k k k大的数字。

注意如果一个数字小于 m i n min min,那么就要把这个数字删除。


思路:

依然算是一道 T r e a p Treap Treap的模板题,菜到已经只会敲模板了啊。
我们发现这里的修改操作全部都是对于所有数的,所以我们不用修改所有的数字,只要记录一个 s u m sum sum表示修改的值即可。
但是注意这样的话新加入的数字应该为 k − s u m k-sum k−sum,因为我们定义每一个数字为 k + s u m k+sum k+sum,但是新加入的数字是不会被前面的修改操作影响的。所以减去 s u m sum sum之后,这个数字就是 ( k − s u m ) + s u m = k (k-sum)+sum=k (k−sum)+sum=k。
插入操作就是普通的插入操作。直接套模板就好了。
然后修改操作我们只需要把 s u m sum sum更改就行了。但是注意我们在进行 S S S操作时要考虑会影响到部分数字会被删除。
因为每一个数字都加上 s u m sum sum,那么对于数字 x x x,如果 x + s u m &lt; m i n x+sum&lt;min x+sum<min,那么 x x x就要被删除。也就是说, T r e a p Treap Treap中所有小于 m i n − s u m min-sum min−sum的数字都要被删除。
由于修改操作很少,所以我们可以考虑暴力修改。先求出 v a l = m i n − s u m val=min-sum val=min−sum的前驱,删除该前驱后再求 v a l ′ = p r e ( v a l ) val&#x27;=pre(val) val′=pre(val),删除 v a l ′ val&#x27; val′,以此类推,直到 v a l ≤ − ∞ val\leq -\infty val≤−∞为止。
查询操作也是最基本的查询操作。但是注意查询的是第 k k k大,而不是第 k k k小。
总体来说还是很裸的,但是就是这样一道裸题都卡了我2天,不想说什么了。


代码:

#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=600010,Inf=2e9;
int n,minn,sum,root,tot,k,leave;
char ch;
bool flag;

struct treenode
{
	int lc,rc,dat,cnt,size,val;
};

struct Treap
{
	treenode t[N];
	
	int New(int val)
	{
		t[++tot].val=val;
		t[tot].dat=rand();
		t[tot].cnt=t[tot].size=1;
		return tot;
	}
	
	void update(int x)
	{
		t[x].size=t[t[x].lc].size+t[t[x].rc].size+t[x].cnt;
	}
	
	void build()
	{
		root=New(-Inf);
		t[1].rc=New(Inf);
		update(1);
	}
	
	void zig(int &x)
	{
		int y=t[x].lc;
		t[x].lc=t[y].rc; t[y].rc=x; x=y;
		update(t[x].rc); update(x);
	}
	
	void zag(int &x)
	{
		int y=t[x].rc;
		t[x].rc=t[y].lc; t[y].lc=x; x=y;
		update(t[x].lc); update(x);
	}
	
	void insert(int &x,int val)
	{
		if (!x)
		{
			x=New(val);
			return;
		}
		if (t[x].val==val)
		{
			t[x].cnt++;
			update(x);
			return;
		}
		if (val<t[x].val)
		{
			insert(t[x].lc,val);
			if (t[x].dat<t[t[x].lc].dat) zig(x);
		}
		else
		{
			insert(t[x].rc,val);
			if (t[x].dat<t[t[x].rc].dat) zag(x);
		}
		update(x);
	}
	
	void del(int &x,int val)
	{
		if (!x) return;
		if (t[x].val==val)
		{
			if (t[x].cnt>0)
			{
				leave+=t[x].cnt;
				t[x].cnt=0;
				//update(x);
			}
			if (t[x].lc || t[x].rc)
			{
				if (!t[x].lc || t[t[x].rc].dat>t[t[x].lc].dat)
					zag(x),del(t[x].lc,val);
				else
					zig(x),del(t[x].rc,val);
				update(x);
			}
			else x=0;
			return;
		}
		if (val<t[x].val) del(t[x].lc,val);
			else del(t[x].rc,val);
		update(x);
	}
	
	int get_val(int x,int rank)
	{
		if (!x)
		{
			flag=0;
			return Inf;
		}
		if (t[t[x].rc].size+1<=rank && t[t[x].rc].size+t[x].cnt>=rank)
			return t[x].val;
		if (rank<=t[t[x].rc].size) return get_val(t[x].rc,rank);
			else return get_val(t[x].lc,rank-t[t[x].rc].size-t[x].cnt);
	}
	
	int pre(int x,int val)
	{
		if (!x) return -Inf;
		if (t[x].val<val) return max(t[x].val,pre(t[x].rc,val));
			else return pre(t[x].lc,val);
	}
}Treap;

int main()
{
	scanf("%d%d",&n,&minn);
	srand(time(0));
	Treap.build();
	while (n--)
	{
		while (ch=getchar()) if (ch>='A'&&ch<='Z') break;
		scanf("%d",&k);
		if (ch=='I')
		{
			k-=sum;
			if (k+sum>=minn) Treap.insert(root,k);
		}
		if (ch=='A') sum+=k;
		if (ch=='S')
		{
			sum-=k;
			int val=Treap.pre(root,minn-sum);
			while (val>-Inf)
			{
				Treap.del(root,val);
				val=Treap.pre(root,val);
			}
		}
		if (ch=='F')
		{
			flag=1;
			int ans=Treap.get_val(root,k+1);
			if (!flag || ans<=-Inf) printf("-1\n");
				else printf("%d\n",ans+sum);
		}
	}
	printf("%d\n",leave);
	return 0;
}
用 SQL 分析不同用户群组留存率 一、前言 用户增长对企业非常重要,主要包括: 新增、留存、召回 。本文介绍一个实用的分析留存率的方法: Cohort Analysis (群组分析),APP的下载量越高并不是说产品就越好,产品若没有很好的留存,花费大量时间和资源来挖掘新客户也将是竹篮打水一场空。群组分析有利于衡量用户在每个漏斗的用户流失节点、用户流失数据,从而帮助你发现产品的用户的行为模式和用户增长点。从本质上讲,群组分析Cohort Analysis为你提供了一种数据驱动的方法,用群组分析Cohort Analysis方法,可以来帮助提 阅读详情

相关推荐

【WSL2+Ubuntu+Docker Desktop】迁移到D盘

该篇文章包含将WSL2+ubuntu+Docker Desktop从C盘迁移到D盘

哈茶的博客 3930

【洛谷1486】[NOI2004] 郁闷的出纳员(Splay的小运用)

点此看题面 大致题意: 你是一个公司的出纳员,现在有\(n\)个操作,操作有4种:新来一个员工、增加全体员工工资、减少全体员工工资、查询第\(k\)多的工资。若一个员工的工资在某一时刻低于合同上的工资\(m\),他会立刻离开公司。要你回答每一个询问并统计出离开公司的人数。 平衡树 比较显然,这是一道平衡树的题目。 至于用哪一种平衡树,我感觉这题用\(Splay\)比较方便吧! 这道题目的关键就在于...

weixin_30735391的博客 85

关于对鱼眼相机图片进行畸变校正的两种思路

鱼眼畸变主要表现为径向畸变(Radial Distortion),图像中心正常,边缘向外拉伸。畸变模型通常基于入射角θ\thetaθ(光线与光学轴夹角)和图像半径rrr的关系。等距投影(Equidistant Projection)rdfθrd​fθ,其中rdr_drd​为畸变图像半径,fff为焦距,θ\thetaθ为入射角。等立体角投影(Equisolid Angle Projection)rd2fsin⁡θ2rd​2fsinθ/2。

qq_45670407的博客 1546

洛谷 P1486 [NOI2004]郁闷的出纳员

题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。 工资的频繁调整很让员工反感,尤其是集体扣除工资...

weixin_30667301的博客 175

自监督预训练(三)wav2vec 2.0原理剖析

一、整体流程 二、feature encoder 理解Conv1d nn.Conv1d(in_channels=5, out_channels=20, kernel_size=3, stride=2) 假设输入input=(batch, in_channels, in_len) batch=1 in_channels=5,对应向量大小,比如word embedding in_len=10,对应word的个数 cnn内部kernel=(in_channels, kernel_size)=(5,3),相当

xmdxcsj的专栏 2万+

数十个锂电池充放电电路,锂电池充放电芯片

关乎锂电池供电的产品,在锂电池上,需要三个电路系统:1,锂电池保护电路,2,锂电池充电电路,3,锂电池输出电路。 内容目录: 单节的锂电池保护电路单节为3.7V锂电池(也叫4.2V)和3.8V锂电池(也叫4.35V) 单节的锂电池充电电路即锂电池保护板 单节的锂电池输出电路锂电池转换稳压输出为:1.2V,3.3V,5V,12V等等 两节的锂电池保护电路两节串联7.4V锂电池(也叫8.4V) 两节的锂电池充电电路即两节锂电池保护板 两节...

kuakewei123的博客 1万+

Treap(三)——#10145. 「一本通 4.6 练习 2」郁闷的出纳员

题目链接:https://loj.ac/problem/10145 解题思路 用Treap解决,用到插入,与查找第k大,不需要特定的删除(即一个一个删除,浪费时间),如果工资减到小于合同工资,我们直接将该点与其左子树删去,并更新离开公司人的数量,并将其右子树移到该点,注意此时该点已经变成其右孩子结点了,再往下减工资,还是从该点开始,最后还要更新一下该点的子树大小。其它的套模板即可。 AC代码 #include <iostream> #include <stdio.h> #includ

hhhcbw的博客,欢迎各位来访 306

告别繁琐!VS Code 下OpenClaw零配置上手秘籍

本文介绍了在VSCode环境下零配置上手OpenClaw开发工具的最佳实践。首先详细说明了VSCode和OpenClaw插件的安装步骤,包括获取安装包、配置环境变量等准备工作。然后重点讲解了核心配置流程:设置OpenClaw路径、调整工作区参数、添加自定义代码片段等优化开发体验的方法。通过创建测试项目验证配置有效性,并针对常见的路径错误、运行报错等问题提供了排查方案。本文旨在帮助开发者快速搭建高效的OpenClaw开发环境,充分发挥VSCode与OpenClaw的组合优势,提升开发效率。无论是新手还是资深开

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 528

【NOI 2004】郁闷的出纳员

算法标签:平衡树(非旋Treap)

forever_dreams的博客 299

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧!

努力前行,总会成为自己心中的那道光 4万+

ZED双目相机环境配置

ZED SDK 安装文件夹中有一个 Python 脚本(get_python_api.py),可以自动检测操作系统、CUDA 和 Python 版本并下载相应的预编译 Python API 包(pyzed)。安装SDK成功后,我们进入ZED SDK文件夹中的tools子文件夹,运行ZED Explorer.exe 以及 ZED Depth Viewer.exe,查看ZED相机是否能正常启用工作。在本例中,我们简单地检索ZED相机的序列号:打开 ZED相机,然后打印其序列号,然后关闭相机。

qq_53545309的博客 2136

洛谷P1486 [NOI2004]郁闷的出纳员

Code: #include&lt;cstdio&gt; #include&lt;algorithm&gt; using namespace std; struct Node{ int s,val,tag,v; Node *ch[2]; Node(int u){ s=1,val=1,tag=0,v=u; ch[0]=ch[1]=NULL...

EM LGH 389

逻辑电平(TTL/CMOS/LVDS/LVPECL/CML)

逻辑电平介绍 TTL------晶体管-晶体管逻辑门(Transistor-Transistor Logic gate) TTL采用5V电源

sinat_15677011的博客 2万+

洛谷P1486 郁闷的出纳员_Treap

题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。 工资的频繁调整很让员工反感,尤其是

蒟蒻的博客 373

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】

Treap;平衡树

niiick 295

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap

思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的。将小于k的分为一棵子树,大于等于k的分为另一棵子树。 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不用管,扔掉。 3. 维护一个加标记,注意不要忘记某个地方的pushdown和pushup 其他就是fhq treap的基本操作了 #include<bits/stdc++.h&...

weixin_30263277的博客 176

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

BZOJ1503: [NOI2004]郁闷的出纳员(洛谷P1486)

平衡树

forezxl的博客 739

洛谷 P1486 [NOI2004] 郁闷的出纳员(splay)

这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。对于2,3两种情况,我们设置一个变量delta,每次涨薪,降薪的时候我们都在deltag上操作,那么每个节点的当前价值加上delta就是实际价值,每次降薪之后,我们需要找到>=min-delta的最小值的工资的节点,然后把这个节点之前的所有节点都删除(不包括L节点)。

weixin_74174531的博客 602

Luogu P1486 [NOI2004]郁闷的出纳员

https://www.luogu.org/problemnew/show/P1486 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的...

YYHS_WSF的博客 247

洛谷 1486 郁闷的出纳员【Treap】

【题意概述】   要求维护一个序列支持以下操作:   1,插入元素x;   2,把序列的所有元素加上x;   3,把序列的所有元素减去x,同时低于一个给定的下限的元素马上被删除;   4,询问序列中第k大的元素。 【题解】   Treap   用一个delta记录元素的增减情况,即实际上的元素的值应该是qval(root,x)+delta,那么插入元素时插入的应该是Val-de...

weixin_30235225的博客 126

[NOI2004, 洛谷P1486]郁闷的出纳员

题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。 工资的频繁调整很让员工反感,尤其是集体扣除...

迷途的羔羊正在向前行进 216

洛谷:P1486 [NOI2004]郁闷的出纳员

原题地址:https://www.luogu.org/problemnew/show/P1486 题目简述 一个序列a,初始为空。 随时插入一个数,查询第k大,全体加,全体减。 但是如果任何数在任何时刻低于给定的下界MIN,则立即移除出序列。 思路 插入,查询第k大,容易发现是BST题。于是上Treap。 全体加全体减暴力加肯定不行,考虑用变量delta储存变化情况。全体加n就是delta+=n...

weixin_30530339的博客 140

假spaly害人-洛谷P1486 郁闷的出纳员

https://www.luogu.org/problem/show?pid=1486#sub 我以前的spaly他妈全抄模版的,然后觉得这样太颓废了,就很装逼地想自己写这题; 其实我理论都懂的,所以我就认为自己应该何以靠自己的力量去做出来; 然后做了两个晚上+1H的在校时间; 算算有6,7个小时呢; 真日了狗了 网上的模版反正烂大街的,这道题hzwer的spaly写的很烂的,结果过了(

我怎么这么菜的呢 2135
上一篇: 【洛谷P3369】【模板】普通平衡树【Treap】
下一篇: 【洛谷P2286】宠物收养场【Treap】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值