[TJOI2007]书架
题目
网上搜
分析
我们可以认为插入一本书是在树中第 \(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]书架的更多相关文章
- [TJOI2007]书架 题解
文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...
- P3850 [TJOI2007]书架
题目描述 Knuth先生家里有个精致的书架,书架上有N本书,如今他想学到更多的知识,于是又买来了M本不同的新书.现在他要把新买的书依次插入到书架中,他已经把每本书要插入的位置标记好了,并且相应的将它们 ...
- Luogu3850 [TJOI2007]书架 (平衡树)
将要插入位置前和前前splay,再连在右子树上. #include <iostream> #include <cstdio> #include <cstring> ...
- [BZOJ1861][Zjoi2006]Book 书架
[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...
- Android分享一款漂亮的折叠书架菜单
一个Android折叠书架菜单,效果极佳,给人的视觉感觉很好,便于使用. FoldingMenu
- [转载]我的Java后端书架 (2016年暖冬4.0版)
[转载]我的Java后端书架 (2016年暖冬4.0版) ps:最近正在初学Java,有一些其他语言的底子,但是还是要好好看书,好好练习,网上找了好久,都没有这份书单来的实用,特意转载过来,方便以 ...
- BZOJ 1861: [Zjoi2006]Book 书架
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1290 Solved: 740[Submit][Stat ...
- 基于HT的CSG功能构建HTML5的3D书架
构造实体几何CSG全称Constructive solid geometry,是3D计算机图形学中构建模型的常用技术,可通过合并Union.相减Subtraction和相交Intersction的三种 ...
- 【代码笔记】iOS-点击加号增加书架,点击减号减少书架
一,效果图. 二,工程图. 三,代码. ReaderViewController.h #import <UIKit/UIKit.h> @interface ReaderViewContro ...
- 【BZOJ-1926】粟粟的书架 二分 + 前缀和 + 主席树
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MBSubmit: 616 Solved: 238[Submit][Statu ...
随机推荐
- Linux配置ipv6脚本
#!/bin/bash REMOTE_IP6="2001:da8:900c:eeee:0:5efe" REMOTE_IP4="" #填你自己学校的路由隧道的ip ...
- DLR 的扩展库 Dynamitey
.NET 在 CLR 对动态语言或者脚本语言的支持是通过DLR 完成的, Miguel de Icaza对 DLR 的特点概括如下: 一个针对动态语言的共享式类型系统: 一个共享的 AST,可以被语言 ...
- Node.js躬行记(25)——Web自动化测试
网页在提测流转给 QA 后,如何能帮他们更有效而准确的完成测试,是我一直在思考的一个问题. QA 他们会对网页编写测试用例,在提测之前会让我们将优先级最高的用例跑通,这在一定程度上能够避免频繁的返工, ...
- python3中的常见知识点2
python3中的常见知识点2 列表与栈和队列 map()函数 python列表遍历的4种方式 参考链接 列表栈和队列 1.列表作为栈使用 栈:先进后出,First In Last Out 使用 ap ...
- 2022-6.824-Lab1:Map&Reduce
lab 地址 : https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 1. 介绍 准备工作 阅读 MapReduce 做什么 实现一个分布式的 Map ...
- 粘包、struct模块、进程并行与并发
目录 粘包现象 struct模块 粘包代码实战 udp协议(了解) 并发编程理论 多道技术 进程理论 进程并行与并发 进程的三状态 粘包现象 1.服务端连续执行三次recv 2.客户端连续执行三次se ...
- 下载kali以及安装
一.kali下载 下载地址:https://www.kali.org/get-kali/#kali-virtual-machines 二.kali安装 1.打开VMware,打开文件,选择刚刚下载并解 ...
- C#多线程(四)并行编程篇之结构化
前言 在前三章中我们的案例大量使用到了Thread这个类,通过其原始API,对其进行创建.启动.中断.中断.终止.取消以及异常处理,这样的写法不仅不够优雅(对接下来这篇,我称其为.NET现代化并行编程 ...
- Django 连接各数据库配置汇总(sqlite3,MySql,Oracle)
在django中,默认配置的数据库是 sqlite3 # Database # https://docs.djangoproject.com/en/2.0/ref/settings/#database ...
- Linux命令篇 - nc(ncat) 命令
nc (ncat) Ncat is a feature-packed networking utility which reads and writes data across networks fr ...