题目描述

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 ≤ 10^3, 1 ≤ Q ≤ 10^3

对于100%的数据,1 ≤ N ≤ 200, 1 ≤ M ≤ 10^5, 1 ≤ Q ≤ 10^4

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

__________________________________________________________________________________

FHQ_TREAP

__________________________________________________________________________________

  1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+300;
4 char s[maxn][12];
5 int n,m,q;
6 struct node
7 {
8 int ch[2],siz,rd,val;
9 }tr[maxn];
10 int tot,root;
11 int newnode(int x)
12 {
13 tot++;
14 tr[tot].siz=1;
15 tr[tot].rd=rand();
16 tr[tot].val=x;
17 tr[tot].ch[1]=tr[tot].ch[0]=0;
18 return tot;
19 }
20 void update(int cur)
21 {
22 tr[cur].siz=tr[tr[cur].ch[0]].siz+tr[tr[cur].ch[1]].siz+1;
23 }
24 int merge(int x,int y)
25 {
26 if(x*y==0)return x+y;
27 if(tr[x].rd<tr[y].rd)
28 {
29 tr[x].ch[1]=merge(tr[x].ch[1],y);
30 update(x);
31 return x;
32 }
33 else
34 {
35 tr[y].ch[0]=merge(x,tr[y].ch[0]);
36 update(y);
37 return y;
38 }
39 }
40 void split(int cur,int k,int &x,int &y)
41 {
42 if(!cur)x=y=0;
43 else
44 {
45 if(k>tr[tr[cur].ch[0]].siz)
46 {
47 x=cur;
48 split(tr[cur].ch[1],k-tr[tr[cur].ch[0]].siz-1,tr[cur].ch[1],y);
49 }
50 else
51 {
52 y=cur;
53 split(tr[cur].ch[0],k,x,tr[cur].ch[0]);
54 }
55 update(cur);
56 }
57 }
58 int kth(int now,int k)
59 {
60 int cur=now;
61 while(cur)
62 {
63 if(tr[tr[cur].ch[0]].siz+1==k)return tr[cur].val;
64 else if(tr[tr[cur].ch[0]].siz>=k)cur=tr[cur].ch[0];
65 else
66 {
67 k-=tr[tr[cur].ch[0]].siz+1;
68 cur=tr[cur].ch[1];
69 }
70 }
71 }
72 void insert(int v,int p)
73 {
74 int x,y;
75 split(root,p-1,x,y);
76 root=merge(merge(x,newnode(v)),y);
77 }
78 void print(int p)
79 {
80 printf("%s\n",s[kth(root,p)]);
81 }
82 int main()
83 {
84 srand((unsigned)time(0));
85 scanf("%d",&n);
86 for(int i=1;i<=n;++i)
87 {
88 scanf("%s",s[i]);
89 root=merge(root,newnode(i));
90 }
91 scanf("%d",&m);
92 int p;
93 for(int i=n+1;i<=n+m;++i)
94 {
95 scanf("%s%d",s[i],&p);
96 insert(i,p+1);
97 }
98 scanf("%d",&q);
99 for(int i=0;i<q;++i)
100 {
101 scanf("%d",&p);
102 print(p+1);
103 }
104 return 0;
105 }

洛谷P3850 书架的更多相关文章

  1. 洛谷P1848 书架

    好,我一直以为书架是splay,然后发现还有个优化DP的书架.妃的书架 蓝书和PPT上面都讲了,应该比较经典吧. 题意: 有n个物品,每个都有宽,高. 把它们分成若干段,使得每段的最大值的总和最小.且 ...

  2. 洛谷P2468 SDOI 2010 粟粟的书架

    题意:给你一个矩形书架,每个点是这本书的页数,每次询问(x1,y1)(x2,y2)这个小矩形里最少需要取几本书使得页数和等于Hi. 题解:小数据二位前缀和预处理+二分答案,大数据一行所以用主席树做,感 ...

  3. [洛谷P2596] [ZJOI2006]书架

    洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...

  4. 洛谷P2468 [SDOI2010]粟粟的书架

    来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...

  5. 洛谷P2464 [SDOJ2008]郁闷的小J

    洛谷P2464 [SDOJ2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他 ...

  6. 洛谷 P1103 书本整理(动规)

    洛谷 P1103 书本整理 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发 ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. Access denied for user ''@'localhost' to database 'mysql'问题

    Access denied for user ''@'localhost' to database 'mysql'问题 MySQL : Access denied for user ''@'local ...

  2. web项目报错 无法解析,丢失包 是缺少本地运行jre

    1.通过build path 添加add Library 2.添加jre

  3. 【wp】2020XCTF_逆向

    前几天的XCTF最后一场终于打完了,三场比赛下来对逆向部分的大概感觉是从第一场的啥都不会做(一道lua+一道apk)到后来的终于能有参与度,至少后两场的题目都是pc逆向,虽然特殊架构但好歹能做(tcl ...

  4. swap是干嘛的?

    本文截取自:http://hbasefly.com/2017/05/24/hbase-linux/ swap是干嘛的? 在Linux下,SWAP的作用类似Windows系统下的"虚拟内存&q ...

  5. Lambda 表达式实例

    public class Java8Tester {/*** 语法 lambda 表达式的语法格式如下: (parameters) -> expression 或 (parameters) -& ...

  6. R绘图(2): 离散/分类变量如何画热图/方块图

    相信很多人都看到过上面这种方块图,有点像"华夫饼图"的升级版,也有点像"热图"的离散版.我在一些临床多组学的文章里面看到过好几次这种图,用它来展示病人的临床信息 ...

  7. JVM 常用命令行工具

    本文部分摘自<深入理解 Java 虚拟机第三版> 基础故障处理工具 Java 开发人员肯定都知道 JDK 的 bin 目录下有许多小工具,这些小工具除了用于编译和运行 Java 程序外,打 ...

  8. kafka如何保证消息得顺序性

    1. 问题 比如说我们建了一个 topic,有三个 partition.生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到 ...

  9. js概念和ECMAScript

    概念 ​ ​就是一门浏览器客户端的脚本语言 运行在客户端浏览器中的,每一个浏览器都有JavaScript的解析引擎. 脚本语言,不需要编译,直接就可以被浏览器解析执行. 好处: ​ 可以增强一些用户的 ...

  10. 用C#实现模拟双色球中奖程序 控制台应用程序

    前言 这是我在大一第一学期C#的课程设计,要求编写一个模拟双色球彩票的控制台应用程序,用以实现简单的模拟选购彩票. 一.双色球购号号码生成: 1.系统购号:通过"随机数"产生双色球 ...