题目:

A. Sereja and Prefixes
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Sereja loves number sequences very much. That's why he decided to make himself a new one following a certain algorithm.

Sereja takes a blank piece of paper. Then he starts writing out the sequence in m stages. Each time he either adds a new number to the end of the sequence or takes l first elements of the current sequence and adds them c times to the end. More formally, if we represent the current sequence as a1, a2, ..., an, then after we apply the described operation, the sequence transforms into a1, a2, ..., an[, a1, a2, ..., al] (the block in the square brackets must be repeated c times).

A day has passed and Sereja has completed the sequence. He wonders what are the values of some of its elements. Help Sereja.

Input

The first line contains integer m (1 ≤ m ≤ 105) — the number of stages to build a sequence.

Next m lines contain the description of the stages in the order they follow. The first number in the line is a type of stage (1 or 2). Type 1 means adding one number to the end of the sequence, in this case the line contains integer xi (1 ≤ xi ≤ 105) — the number to add. Type 2 means copying a prefix of length li to the end ci times, in this case the line further contains two integers li, ci (1 ≤ li ≤ 105, 1 ≤ ci ≤ 104), liis the length of the prefix, ci is the number of copyings. It is guaranteed that the length of prefix li is never larger than the current length of the sequence.

The next line contains integer n (1 ≤ n ≤ 105) — the number of elements Sereja is interested in. The next line contains the numbers of elements of the final sequence Sereja is interested in. The numbers are given in the strictly increasing order. It is guaranteed that all numbers are strictly larger than zero and do not exceed the length of the resulting sequence. Consider the elements of the final sequence numbered starting from 1 from the beginning to the end of the sequence.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

Output

Print the elements that Sereja is interested in, in the order in which their numbers occur in the input.

Examples
input
6
1 1
1 2
2 2 1
1 3
2 5 2
1 4
16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
output
1 2 1 2 3 1 2 1 2 3 1 2 1 2 3 4

题意:

  有两种操作:1)在数组后面加上一个x

        2)选在数组前 l 个数 复制 c 次, 放在数组后

  样例:

    1 1  -> [1]

    1 2  -> [1, 2]

    2 2 1 -> [1, 2, {1, 2}]

    1 3  -> [1, 2, {1, 2}, 3]

    2 5 2 ->[1, 2, {1, 2}, 3, {1, 2, 1, 2, 3}, {1, 2, 1, 2, 3}]

    1 4 -> [1, 2, {1, 2}, 3, {1, 2, 1, 2, 3}, {1, 2, 1, 2, 3}, 4]。

题解:

  当我们询问pos的数值的时候,有2种情况:(1)这个位置是通过 1 插入的(实)的数值, (2)这个位置是复制的, 没有实的数值。

  当是实的数值的时候,直接输出。下面就讨论虚的数值。

  询问的位置 pos 。由于是在复制的区域。那个这个指令就有个最后的一个复制的位置temp。

  例如在样例中的 2 5 2 中, temp = 15。

  而这个复制区域的前一个位置就是 temp - l * c (15 - 5 * 2 = 5), 我们需要找的就是pos 对应在前缀的位置 , pos -  (temp - l * c)。

  比如说我们询问第6个位置,那么它对应的位置就是 6 - (15 - 2 * 5) = 1。

  但是我们如果是询问第11 个位置,11 - (15 - 2 * 5 ) = 6。 这时我们就需要 mod 复制的长度 l , 6 % 5 = 1。 所以11位置就对应的是第1号位置。

  就产生一个新的pos' ,查看这个新的pos' 的数值是否是虚的。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
using namespace std;
typedef long long LL;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
const int INF = 0x7fffffff;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+;
const int maxn = +;
struct node
{
int op, l, c;
int x;
LL len;
node(){
x = l = c = ;
len = ;
}
friend bool operator <(node x1, node x2){
return x1.len < x2.len;
}
};
node t[maxn];
LL len, m;
void init(){
len = 1LL;
}
int ans(LL pos)
{
node now; now.len = pos;
LL wei = lower_bound(t, t+m, now) - t;
if(t[wei].len == pos && t[wei].op == ) return t[wei].x;
else{
LL temp = t[wei].len;
temp -= t[wei].c*t[wei].l;
pos -= temp;
pos %= t[wei].l;
if(pos==) pos = t[wei].l;
return ans(pos);
}
}
void solve() {
LL n, op, a, b, pos;
cin >> m;
for(LL i = ;i<m;i++){
cin >> op >> a;
if(op==){
t[i].op = ;
t[i].x = a;
t[i].len = len;
len++;
}
else{
cin >> b;
t[i].op = ;
t[i].l = a;
t[i].c = b;
len+=a*b;
t[i].len = len-;
}
}
cin >> n;
for(LL i = ;i<n;i++){
cin >> pos;
cout << ans(pos) << " ";
}
cout << endl;
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
ios::sync_with_stdio();
cin.tie();
init();
solve();
return ;
}

codeforces 380A Sereja and Prefixes (递归)的更多相关文章

  1. Codeforces 380A - Sereja and Prefixes

    原题地址:http://codeforces.com/problemset/problem/380/A 让期末考试整的好久没有写题, 放假之后由于生病也没怎么做,新年的第一场CF也不是那么在状态,只过 ...

  2. Codeforce 380A Sereja and Prefixes【二分】

    题意:定义两种操作 1 a ---- 向序列中插如一个元素a 2 a b ---- 将序列的前a个元素[e1,e2,...,ea]重复b次插入到序列中 经过一列操作后,为处于某个位置p的元素是多少.数 ...

  3. CodeForces - 50A Domino piling (贪心+递归)

    CodeForces - 50A Domino piling (贪心+递归) 题意分析 奇数*偶数=偶数,如果两个都为奇数,最小的奇数-1递归求解,知道两个数都为1,返回0. 代码 #include ...

  4. codeforces 314E Sereja and Squares

    discription Sereja painted n points on the plane, point number i (1 ≤ i ≤ n) has coordinates (i, 0). ...

  5. Codeforces 425A Sereja and Swaps(暴力枚举)

    题目链接:A. Sereja and Swaps 题意:给定一个序列,能够交换k次,问交换完后的子序列最大值的最大值是多少 思路:暴力枚举每一个区间,然后每一个区间[l,r]之内的值先存在优先队列内, ...

  6. codeforces 425C Sereja and Two Sequences(DP)

    题意读了好久才读懂....不知道怎么翻译好~~请自便~~~ http://codeforces.com/problemset/problem/425/C 看懂之后纠结好久...不会做...仍然是看题解 ...

  7. codeforces B. Sereja and Stairs 解题报告

    题目链接:http://codeforces.com/problemset/problem/381/B 题目意思:给定一个m个数的序列,需要从中组合出符合楼梯定义 a1 < a2 < .. ...

  8. codeforces A. Sereja and Bottles 解题报告

    题目链接:http://codeforces.com/problemset/problem/315/A 题目意思:有n个soda bottles,随后给出这n个soda bottles的信息.已知第 ...

  9. codeforces C. Sereja and Swaps

    http://codeforces.com/contest/426/problem/C 题意:找出连续序列的和的最大值,可以允许交换k次任意位置的两个数. 思路:枚举区间,依次把区间内的比较小的数换成 ...

随机推荐

  1. linux下安装nginx(nginx(nginx-1.8.0.tar.gz),openssl(openssl-fips-2.0.9.tar.gz) ,zlib(zlib-1.2.11.tar.gz),pcre(pcre-8.39.tar.gz))

    :要按顺序安装: 1:先检查是否安装 gcc ,没有先安装:通过yum install gcc-c++完成安 2:openssl : tar -zxf  openssl-fips-2.0.9.tar. ...

  2. 前端004/React常用UI组件

    每天进步一点点〜 Ant Design of React //蚂蚁金服设计平台.需要应用何种类型组件可参考API React + mobx + nornj 开发模式文件说明: [1].A.t.html ...

  3. vue --》组件的封装 及 参数的传递

    vue组件的定义 ● 组件(Component)是Vue.js最强大的功能之一 ● 组件可以扩展HTML元素,封装可重用代码 ● 在较高层面上,组件是自定义元素,Vue.js的编译器为他添加特殊功能 ...

  4. Java第四周编程总结

    第四周编程总结 1.写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和height都是double型的,而color则是String类型的. ...

  5. 小白学Python(12)——pyecharts ,生成词云图 WordCloud

    WordCloud(词云图) from pyecharts import options as opts from pyecharts.charts import Page, WordCloud fr ...

  6. 问题 G: 圆桌上的晚餐

    问题 G: 圆桌上的晚餐 时间限制: 1 Sec  内存限制: 128 MB提交: 1583  解决: 656[提交] [状态] [命题人:jsu_admin] 题目描述         大家一定在圆 ...

  7. 利用tesseract-ocr进行验证码识别

    因为爬虫项目需要模拟登陆,可是有一个网站的登录需要输入验证码.其实这种登录有2种解决方案,一种是利用cookie,一种是识别图片.前者需要人工登录一次,而且有时效限制,故不太现实.后者可以,但是难点是 ...

  8. 前端开发HTML&css入门——盒子模型以及部分CSS样式

    CSS处理网页时,它认为每个元素都包含在一个不可见的盒子里.• 为什么要想象成盒子呢?因为如果把所有的元素都想象成盒子,那么我们对网页的布局就相当于是摆放盒子.• 我们只需要将相应的盒子摆放到网页中相 ...

  9. CentOS下性能监测工具 dstat

    原文链接:http://www.bkjia.com/Linuxjc/935113.html 参考链接:https://linux.cn/article-3215-1.html,http://lhfli ...

  10. python基础--内置函数map

    num_1=[1,2,10,5,3,7] # num_2=[] # for i in num_1: # num_2.append(i**2) # print(num_2) # def map_test ...