题目描述

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

输入输出格式

输入格式:

输入文件的第一行为整数N,接下来N行分别是书架上依次放着的N本书的书名(书名由不含空格的字符串构成,长度不超过10)。下一行将要输入一个整数M,接下来的M行分别为这本书的书名和要插入的位置。下一行将要输入一个整数Q,接下来共有Q次询问,每行都是一个整数表示询问的位置。(书架上位置的编号从0开始)

输出格式:

输出Q行,每行对应着相应查询位置的书名。

输入输出样例

输入样例#1:

3
Math
Algorithm
Program
2
Picture 2
System 1
3
0
1
3
输出样例#1:

Math
System
Picture

说明

原来有三本书Math、Algorithm、System,后来又买了两本书,分别插入到2和1的位置,每次插入时其他书都要向后挪一个位置,最后书架上书的序列为:

0 Math

1 System

2 Algorithm

3 Picture

4 Program

Q次询问依次为0, 1, 3位置的书,所以答案为:Math、System、Picture

对于30%的数据,1 ≤ N ≤ 100, 1 ≤ M ≤ 103, 1 ≤ Q ≤ 103

对于100%的数据,1 ≤ N ≤ 200, 1 ≤ M ≤ 105, 1≤Q≤104

对于100%的数据都符合题目中所描述的限制关系,数据保证每次插入的位置均不超过当时书架上书的数量,而且保证Q次查询中的每个位置上一定有书。

Solution:

  水题,就一SB平衡树。

  用平衡树维护中序,直接模拟插入的过程,再查询第k位置输出就好了。

代码:

/*Code by 520 -- 10.3*/
#include<bits/stdc++.h>
#define il inline
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
using namespace std;
const int N=;
int n,m,ch[N][],root,cnt,siz[N],date[N],rnd[N];
string s[N];
il int newnode(int v){siz[++cnt]=,date[cnt]=v,rnd[cnt]=rand();return cnt;}
il void up(int x){siz[x]=siz[ch[x][]]+siz[ch[x][]]+;}
int merge(int x,int y){
if(!x||!y) return x+y;
if(rnd[x]<rnd[y]) {ch[x][]=merge(ch[x][],y),up(x);return x;}
else {ch[y][]=merge(x,ch[y][]),up(y);return y;}
}
void split(int rt,int v,int &x,int &y){
if(!rt) {x=y=;return;}
if(siz[ch[rt][]]<v) x=rt,split(ch[rt][],v-siz[ch[rt][]]-,ch[x][],y),up(x);
else y=rt,split(ch[rt][],v,x,ch[y][]),up(y);
}
il int kth(int rt,int v){
while(){
if(siz[ch[rt][]]>=v) rt=ch[rt][];
else if(siz[ch[rt][]]+<v) v-=siz[ch[rt][]]+,rt=ch[rt][];
else return date[rt];
}
}
int main(){
ios::sync_with_stdio();
cin>>n; int v,x,y;
For(i,,n) cin>>s[i],root=merge(root,newnode(i));
cin>>m;
For(i,n+,n+m) cin>>s[i]>>v,split(root,v,x,y),root=merge(merge(x,newnode(i)),y);
cin>>m;
For(i,,m) cin>>v,split(root,v,x,y),cout<<s[kth(y,)]<<endl,root=merge(x,y);
return ;
}

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

  1. [TJOI2007]书架 题解

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

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

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

  3. 洛谷P3850 书架

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

  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 ...

随机推荐

  1. webpack vue app.js自动注入页面.为app.js增加随机参数

    node_modules/html-webpack-plugin/index.js 搜索 postProcessHtml 修改代码增加如下: if (assetTags && asse ...

  2. Linux之linux基础命令

    一.命令分:内部命令.外部命令① 内部命令:是由 Shell解释器解释的② 外部命令:除了Shell解释器以外的命令③ 识别命令类型:type 命令字 二.命令一般组成格式: 命令字 [选项].. [ ...

  3. 人脸识别-关于face_recognition库的安装

    首先十分感谢博客https://blog.csdn.net/scc_722/article/details/80613933,经历过很多尝试(快要醉了),终于看了这篇博客后安装成功. face_rec ...

  4. alibaba/Sentinel 分布式 系统流量防卫兵

    Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多 ...

  5. 从零开始的Python学习Episode 21——socket基础

    socket基础 网络通信要素: A:IP地址   (1) 用来标识网络上一台独立的主机 (2) IP地址 = 网络地址 + 主机地址(网络号:用于识别主机所在的网络/网段.主机号:用于识别该网络中的 ...

  6. 黑客攻防web安全实战详解笔记

    如有不足,欢迎指出,谢谢! ----------------------------------------- 1,url传值 GET传值:其传递的值会附加到url上  POST传值:其传递的值不会加 ...

  7. Python中fnmatch模块的使用

    fnmatch()函数匹配能力介于简单的字符串方法和强大的正则表达式之间,如果在数据处理操作中只需要简单的通配符就能完成的时候,这通常是一个比较合理的方案.此模块的主要作用是文件名称的匹配,并且匹配的 ...

  8. bootstrap中的data-toggle模态框相关

    一,点击即打开1,点击按钮 <a href="javascript:void(0)" class="btn btn-primary" data-toggl ...

  9. OO的第一次死亡

    久仰OO大名,总是想着提前做点准备,其实到头来还是什么准备都没有做,所以这学期就是从零开始的面向对象生活,也因此遇到了很多的问题. 第一次作业——多项式加减 第一次作业历来是较为简单的,但是对于面向对 ...

  10. 冲刺One之站立会议7 /2015-5-20

    2015-5-20 在登陆成功之后要实现的是聊天界面的交互过程,不同的IP进行信息和数据的传递,这方面我们上学期Java实验里面有过相关的内容,我们把它拿过来改了一下格式,试着看能不能成功,目前还没实 ...