P3850 [TJOI2007] 书架

news/2025/1/8 19:18:01/文章来源:https://www.cnblogs.com/LG017/p/18658173

P3850 [TJOI2007] 书架

[TJOI2007] 书架

题目描述

Knuth 先生家里有个精致的书架,书架上有 \(N\) 本书,如今他想学到更多的知识,于是又买来了 \(M\) 本不同的新书。现在他要把新买的书依次插入到书架中,他已经把每本书要插入的位置标记好了,并且相应的将它们放好。由于 Knuth 年龄已大,过几天他已经记不清某些位置上放的到底是什么书了,请问你能帮助他吗?

对于 \(100\%\) 的数据,\(1 \leqslant N \leqslant 200\), \(1 \leqslant M \leqslant 10^5\), \(1 \leqslant Q \leqslant 10^4\). 保证输入合法

Solution:

最近线段树写吐了捏,来写平衡树捏,平衡树好写捏。

其实我没太搞懂这是怎么评到紫的,我们只需要按照题面维护一颗平衡树,然后对于每个插入操作 (x,k),将 FHQ-Treap 的前 k 个节点splite出来,然后再按照 (L,x,R) 的顺序 merge 回去。
查询也是直接 splite 然后输出,再 merge

感觉没什么难的,几乎没有任何思维难度。

感觉这个甚至比平衡树模板简单

点击此处与妙妙思维平衡题一决高下

Code:

#include<bits/stdc++.h>
const int N=1.1e5+5;
int rd(){return rand()*rand()+1;}
using namespace std;
//FHQ-Treap:
int n,m,cnt,rt,q;
struct FHQ_Treap{struct Tree{int ls,rs,val,siz,rnd;}t[N];void pushup(int x){t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1;}int Node(){cnt++;t[cnt]={0,0,cnt,1,rd()};return cnt;}void splite(int x,int &a,int &b,int k){if(!x){a=b=0;return;}int tmp=t[t[x].ls].siz+1;if(tmp<=k){a=x;splite(t[x].rs,t[a].rs,b,k-tmp);pushup(a);}else{b=x;splite(t[x].ls,a,t[b].ls,k);pushup(b);}}int merge(int x,int y){if(!x||!y)return x|y;if(t[x].rnd<t[y].rnd){t[x].rs=merge(t[x].rs,y);pushup(x);return x;}else{t[y].ls=merge(x,t[y].ls);pushup(y);return y;}}
}T;
string s[N];
void work()
{cin>>n;for(int i=1;i<=n;i++){cin>>s[i];rt=T.merge(rt,T.Node());}cin>>m;for(int i=1,k,a,b;i<=m;i++){cin>>s[T.Node()];cin>>k;T.splite(rt,a,b,k);rt=T.merge(T.merge(a,cnt),b);}cin>>q;for(int i=1,k,a,b,c;i<=q;i++){cin>>k;T.splite(rt,a,b,k+1);T.splite(a,a,c,k);cout<<s[T.t[c].val]<<"\n";rt=T.merge(T.merge(a,c),b);}
}
int main()
{//freopen("P3850.in","r",stdin);freopen("P3850.out","w",stdout);ios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865475.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城市生命线安全管理:数据要素整合与场景应用实践

城市生命线工程是确保城市正常运行和居民安全生活的关键基础设施,涉及供水、排水、燃气、电力等多个方面。随着信息技术的发展,特别是大数据、物联网、人工智能等技术的应用,城市生命线数据要素与场景应用的深度融合成为提升城市治理能力的重要途径。数据要素的重要性城市生…

SqlSugar入门教程:连接,增、删、改、查

原文链接:https://blog.csdn.net/zls365365/article/details/131199132 第一步,自然是新建一个项目,控制台什么都可以。因为我还没想好怎么做一个完整的项目,那暂且用一个控制台举例吧。 下面自然是从NuGet安装sqlsugar了。注意鉴别需要安装的版本,我这里是安装sqlsugarc…

env(safe-area-inset-bottom) 兼容写法

先看下兼容性:可以看到 @supports 兼容性很好,所以使用 @supports 做兼容是个不错的选择。 例:@supports (padding-bottom: env(safe-area-inset-bottom)) or(padding-bottom: constant(safe-area-inset-bottom)) {.your-dom {padding-bottom: constant(safe-area-inset-bot…

工业采集系统-天然气计量仪表费用二次计算

1、在“驱动管理->中间件驱动”中添加NaturalGasCalculation.drive。2、在设备配置中,添加采集设备,假设采集到的天然气费用因子为D1.F1,充值金额因子为D1.F2,要求计算的天然气使用体积因子为D1.F3。3、在“系统功能->中间件”中添加一个天然气费用计算中间件,配置内…

SQL优化有绝招,使用DAS提升工作效率!完成任务可领取保暖手套!

​「使用DAS实现数据库SQL优化」活动上线了! 数据库自治服务(Database Autonomy Service,简称DAS)是一种基于机器学习和专家经验实现数据库自感知、自修复、自优化、自运维及自安全的云服务。数据库自治服务DAS支持自动SQL优化,相比传统的优化方式,能够自动识别问题SQL,…

类关系图

本文描述了面向对象设计中类与类之间的五种关系,并对这五种关系从耦合程度、语义和方向上进行了比较。类关系图

特种作业操作(低压电工)实操考试资料整理

为啥去考 在B站关注城阳电工电路等赛博电工师傅们已经有一段时间了,我很喜欢看这些师傅们解决生活中的、生产上的各种电气问题,2023年春天就想去报名学,但是那时候学业很繁忙,而初证又需要去线下学习一段时间。到2024年11月发现自己这段时间突然有空,就尽快找了一家机构报…

AutoGen入门-让两个AI自行聊天完成任务

AutoGen介绍 AutoGen 是一个开源编程框架,用于构建 AI 代理并促进多个代理之间的合作以解决问题。AutoGen 旨在提供一个易于使用和灵活的框架,以加速代理型 AI 的开发和研究,就像 PyTorch 之于深度学习。它提供了诸如代理之间可以对话、LLM 和工具使用支持、自主和人机协作工…

Centos7 安装redis教程

步骤一:安装gcc依赖检查gcc是否已经安装,命令:gcc -v,出现下图说明已经安装由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装yum install -y gcc步骤二:下载redis安装包 https://download.redis.io/relea…

【编码】如何实现一套自定义网络协议?

前言 下文介绍的自定义协议仅作为学习示例,纯粹是玩具项目,没有实际可用性。无需过度关注和讨论其合理性 进行通信的双方是谁? 常见的模型 客户端-服务器,例如HTTP协议,浏览器<=>Web服务器。 中转站模型,如MQTT协议,应用服务<=>中转站<=>硬件客户端 对…

记录一个使用VsCode来ssh的问题(已经打开了ssh的一个文件夹路径,怎么新开一个文件夹路径)

一、操作 使用快捷键 Ctrl+Shift+P(Windows) 或 Cmd+Shift+P (Mac)打开 命令面板 然后输入: File:Open Folder之后就可以选项新的路径打开了。。。没想到我被这个卡了好久,有点无语。