题目

网上搜

分析

我们可以认为插入一本书是在树中第 \(k\) 的位置进行插入操作

其中 \(k\) 为这本放入书架后的位置

考虑 \(fhq-treap\) 实现

我们将书编号为 \([0,n-1]\)

那么如果插入的书的位置为 \(k\),实际上是在树中位置为 \(k+1\)

将前 \(k\) 个分裂出来就可以插入,再合并还原即可

询问操作就是查第 \(k\) 位

\(Code\)

#include<cstdio>
#include<algorithm>
#include<ctime>
using namespace std; const int N = 1e5 + 500;
int n, m, q, rt, tot;
char s[N][20];
struct node{
int ls, rs, siz, val, rnd;
}tr[N]; int read()
{
int res = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9')
res=(res<<3)+(res<<1)+ch-'0', ch = getchar();
return res;
} void pushup(int p){tr[p].siz = tr[tr[p].ls].siz + tr[tr[p].rs].siz + 1;} int new_node(int v)
{
static int size = 0;
tr[++size] = node{0, 0, 1, v, rand()};
return size;
} void split(int p, int k, int &x, int &y)
{
if (!p) x = y = 0;
else{
if (k <= tr[tr[p].ls].siz)
y = p, split(tr[p].ls, k, x, tr[p].ls);
else x = p, split(tr[p].rs, k - tr[tr[p].ls].siz - 1, tr[p].rs, y);
pushup(p);
}
} int merge(int x, int y)
{
if (!x || !y) return x + y;
if (tr[x].rnd < tr[y].rnd)
{
tr[x].rs = merge(tr[x].rs, y);
pushup(x); return x;
}
else{
tr[y].ls = merge(x, tr[y].ls);
pushup(y); return y;
}
} void insert(int k, int v)
{
int a, b;
split(rt, k, a, b);
rt = merge(a, merge(new_node(v), b));
} int kth(int k)
{
int a, b, c, d;
split(rt, k - 1, a, b), split(b, 1, c, d);
merge(a, merge(c, d));
return tr[c].val;
} int main()
{
srand(time(0));
scanf("%d", &n);
for(register int i = 1; i <= n; ++i) scanf("%s", s[tot++]), insert(i - 1, tot - 1);
scanf("%d", &m);
for(register int i = 1, x; i <= m; ++i) scanf("%s", s[tot++]), insert(x = read(), tot - 1);
scanf("%d", &q);
for(register int i = 1, x; i <= q; ++i) x = read(), printf("%s\n", s[kth(x + 1)]);
}

[TJOI2007]书架的更多相关文章

  1. [TJOI2007]书架 题解

    文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...

  2. P3850 [TJOI2007]书架

    题目描述 Knuth先生家里有个精致的书架,书架上有N本书,如今他想学到更多的知识,于是又买来了M本不同的新书.现在他要把新买的书依次插入到书架中,他已经把每本书要插入的位置标记好了,并且相应的将它们 ...

  3. Luogu3850 [TJOI2007]书架 (平衡树)

    将要插入位置前和前前splay,再连在右子树上. #include <iostream> #include <cstdio> #include <cstring> ...

  4. [BZOJ1861][Zjoi2006]Book 书架

    [BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...

  5. Android分享一款漂亮的折叠书架菜单

    一个Android折叠书架菜单,效果极佳,给人的视觉感觉很好,便于使用. FoldingMenu

  6. [转载]我的Java后端书架 (2016年暖冬4.0版)

      [转载]我的Java后端书架 (2016年暖冬4.0版) ps:最近正在初学Java,有一些其他语言的底子,但是还是要好好看书,好好练习,网上找了好久,都没有这份书单来的实用,特意转载过来,方便以 ...

  7. BZOJ 1861: [Zjoi2006]Book 书架

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1290  Solved: 740[Submit][Stat ...

  8. 基于HT的CSG功能构建HTML5的3D书架

    构造实体几何CSG全称Constructive solid geometry,是3D计算机图形学中构建模型的常用技术,可通过合并Union.相减Subtraction和相交Intersction的三种 ...

  9. 【代码笔记】iOS-点击加号增加书架,点击减号减少书架

    一,效果图. 二,工程图. 三,代码. ReaderViewController.h #import <UIKit/UIKit.h> @interface ReaderViewContro ...

  10. 【BZOJ-1926】粟粟的书架 二分 + 前缀和 + 主席树

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 616  Solved: 238[Submit][Statu ...

随机推荐

  1. 批量将多个相同Excel表格内容合并到一个Excel表格的sheet工作簿当中。

    Sub Books2Sheets()Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) Dim ...

  2. 简单的Dos命令学习

    Dos命令学习 打开CMD的方式 从菜单栏打开,windows系统里 win+R 输入cmd 在任意文件夹下,按住shift+右键,点击打开PowerShell 在资源管理器的地址栏前面加上cmd+空 ...

  3. 使用Spring Reactor优化推荐流程

    1. 背景 公司有一个推荐系统Rec,这个系统的主要功能是: 向外部系统提供推荐接口 根据请求获取推荐策略 根据推荐策略完成推荐的召回.过滤.打分.排序阶段 Rec作为微服务中的一环,本身不存储召回的 ...

  4. 一文带你搞懂 Google 发布的新开源项目 GUAC

    随着软件供应链攻击的显著增加,以及 Log4j 漏洞带来的灾难性后果和影响,软件供应链面临的风险已经成为网络安全生态系统共同关注的最重要话题之一.根据业内权威机构 Sonatype 发布的2022软件 ...

  5. 一文了解 Dubbo 的代码架构

    整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层 ...

  6. python 水仙花数、菱形、99乘法表、直角三角形

    空心菱形 i = 1 while i <= 3: # 控制行数 j = 1 k = 1 while j <= 3-i: # 控制空格数量 print(" ", end= ...

  7. [数据结构]单向链表及其基本操作(C语言)

    单向链表 什么是单向链表 链表是一种物理储存单元上非连续.非顺序的储存结构.它由一系列结点(链表中每一个元素称为结点)组成,结点可动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存 ...

  8. 高并发解决方案orleans实践

    开具一张图,展开来聊天.有从单个服务.consul集群和orleans来展开高并发测试一个小小数据库并发实例. 首先介绍下场景,创建一个order,同时去product表里面减掉一个库存.很简单的业务 ...

  9. LVGL 中图片使用问题

    此笔记主要是记录在 LVGL 中使用图片的几种方式,以及使用过程中遇到的问题.最近在 ARM linux 中使用 LVGL 时,发现加载图片变得很卡,一开始还好,当连续加载的图片变多后,特别是动画的过 ...

  10. SwiftUI(一)

    macOS 11.4 Xcode 12.5.1 1.新建工程,创建一个swiftui文件   2.创建后有些画布是在下面显示的     3.先来看下效果图   4. CardImageView.swi ...