题意:定义两种操作

  • 1 a ---- 向序列中插如一个元素a
  • 2 a b ---- 将序列的前a个元素[e1,e2,...,ea]重复b次插入到序列中

经过一列操作后,为处于某个位置p的元素是多少。数据范围共有105以内的操作,形成序列中的元素总个数大小不超过64bit长整型表示。

思考:只需要记录两种操作这些关键元素的位置,如果查询的坐标位置刚好是第一种产生的,那么直接就知道结果了;如果查询的是第二种操作产生的,它是由前a个元素重复b次而来,它来自前a个元素,依次递归向前找,直到找到第一种情况。

1 const int maxn = 100005;
2 __int64 pos[maxn];
3 __int64 val[maxn];
4 int flag[maxn];

可能用struct放到一起更直观一些。

flag用来标记,当前元素如果为1,则为第一种操作产生,pos此时记录当前元素位置,val记录当前元素的值。

flag为0时候,则为第二种操作产生,pos记录第二种操作开始的元素位置,val记录a,即序列的前a个元素,这个长度a。

知道这些我们就好办了,用二分,LowBound去找序列中查询元素位置在pos中的下界。然后根据flag来判断是否需要递归继续往下找,或是返回找到的结果。

 1 __int64 GetResult(__int64 key) {
2 int l = 0, r = len-1;
3 while (l <= r) {
4 int m = (l+r) >> 1;
5 if (pos[m] == key) {
6 if (flag[m]) return val[m];
7 else return GetResult((key-pos[m]+1)%val[m] != 0 ? ((key-pos[m]+1)%val[m]) : val[m]);
8 } else if (pos[m] < key) {
9 l = m+1;
10 } else {
11 r = m-1;
12 }
13 }
14 return GetResult((key-pos[r]+1)%val[r] != 0 ? ((key-pos[r]+1)%val[r]) : val[r]);
15 }

下面是完整代码:

  1 #define _CRT_SECURE_NO_DEPRECATE
2 #define _SECURE_SCL 0
3 #pragma comment(linker, "/STACK:66777216")
4 #include <algorithm>
5 #include <string>
6 #include <complex>
7 #include <cassert>
8 #include <memory>
9 #include <set>
10 #include <stack>
11 #include <map>
12 #include <list>
13 #include <deque>
14 #include <numeric>
15 #include <cctype>
16 #include <cstddef>
17 #include <vector>
18 #include <queue>
19 #include <iostream>
20 #include <iomanip>
21 #include <iterator>
22 #include <cmath>
23 #include <cstdio>
24 #include <cstdlib>
25 #include <sstream>
26 #include <fstream>
27 #include <ctime>
28 #include <cstring>
29 #include <functional>
30 #include <bitset>
31 using namespace std;
32
33 #if defined(_MSC_VER) || defined(__BORLANDC__)
34 typedef unsigned __int64 uint64;
35 typedef signed __int64 int64;
36 #else
37 typedef unsigned long long uint64;
38 typedef signed long long int64;
39 #endif
40 typedef vector<int> VI;
41 typedef vector<string> VS;
42 typedef pair<int,int> PII;
43 typedef pair<int64,int64> PLL;
44 typedef vector<int64> VL;
45
46 #define pb push_back
47 #define ppb pop_back
48 #define mp make_pair
49 #define fi first
50 #define se second
51 #define pii pair<int,int>
52 #define pdd pair<double,double>
53 #define FOR(i,a,b) for (int _n(b), i(a); i <= _n; i++)
54 #define FORD(i,a,b) for(int i=(a),_b=(b);i>=_b;i--)
55 #define all(c) (c).begin(), (c).end()
56 #define SORT(c) sort(all(c))
57 #define REP(i,n) FOR(i,1,(n))
58 #define REPT(i,n) FOR(i,0,(n)-1)
59 #define L(s) (int)((s).size())
60 #define C(a) memset((a),0,sizeof(a))
61 #define IOS ios::sync_with_stdio(false)
62
63 const double pi = 3.1415926535897932384626433832795028841971;
64 const double EPS = 1E-9;
65 const int64 INF64 = (int64)1E18;
66 const int INF = 1000000000;
67
68 static inline bool get(int &v) {
69 int s = 1, c;
70 while(!isdigit(c = getchar())&&c != '-')
71 if(c == EOF) break ;
72
73 if(c == EOF) return 0;
74 if(c == '-') s = 0 , v = 0;
75 else v = c^48;
76 for(;isdigit(c = getchar());v = (v << 1) + (v << 3) + (c ^ 48));
77 v = (s ? v : -v);
78 return 1 ;
79 }
80 int len = 0;
81 const int maxn = 100005;
82 __int64 pos[maxn];
83 __int64 val[maxn];
84 int flag[maxn];
85
86 __int64 GetResult(__int64 key) {
87 int l = 0, r = len-1;
88 while (l <= r) {
89 int m = (l+r) >> 1;
90 if (pos[m] == key) {
91 if (flag[m]) return val[m];
92 else return GetResult((key-pos[m]+1)%val[m] != 0 ? ((key-pos[m]+1)%val[m]) : val[m]);
93 } else if (pos[m] < key) {
94 l = m+1;
95 } else {
96 r = m-1;
97 }
98 }
99 return GetResult((key-pos[r]+1)%val[r] != 0 ? ((key-pos[r]+1)%val[r]) : val[r]);
100 }
101
102
103 void run() {
104 int m, n, op;
105 __int64 e, l, c, v = 1;
106 cin >> m;
107 FOR(i, 1, m) {
108 cin >> op;
109 if (op == 1) {
110 cin >> e;
111 pos[len] = v;
112 val[len] = e;
113 flag[len] = 1;
114 len += 1;
115 v++;
116 } else {
117 cin >> l >> c;
118 pos[len] = v;
119 val[len] = l;
120 flag[len] = 0;
121 v = l*c + pos[len];
122 len += 1;
123 }
124 }
125 __int64 key;
126 cin >> n;
127 FOR(i, 1, n) {
128 cin >> key;
129 cout << GetResult(key) << " ";
130 }
131 cout << endl;
132 }
133
134
135
136 int main() {
137 #ifdef __DEBUG__
138 freopen("test.in","r",stdin);
139 freopen("test.out","w",stdout);
140 time_t st = clock();
141 #endif
142 run();
143 #ifdef __DEBUG__
144 printf( "\n=============\n");
145 printf("Time: %.2lf sec\n",(clock()-st)/double(CLOCKS_PER_SEC));
146 #endif
147 return 0;
148 }

Codeforce 380A Sereja and Prefixes【二分】的更多相关文章

  1. codeforces 380A Sereja and Prefixes (递归)

    题目: A. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input st ...

  2. Codeforces 380A - Sereja and Prefixes

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

  3. codeforce 955c --Sad powers 思路+二分查找

    这一题的题意是   定义一个数,该数特点是为a的p次方 (a>0,p>1) 再给你n个询问,每个询问给出一个区间,求区间内该数的数目. 由于给出的询问数极大(10e5) 所以,容易想到应该 ...

  4. CF:Problem 426B - Sereja and Mirroring 二分或者分治

    这题解法怎么说呢,由于我是把行数逐步除以2暴力得到的答案,所以有点二分的意思,可是昨天琦神说是有点像分治的意思.反正总的来说:就是从大逐步细化找到最优答案. 可是昨晚傻B了.靠! 多写了点东西,然后就 ...

  5. [codeforce 975C] Valhalla Siege (二分)

    Examples input 5 5 1 2 1 2 1 3 10 1 1 1 output 3 5 4 4 3 input 4 4 1 2 3 4 9 1 10 6 output 1 4 4 1 N ...

  6. Codeforces Round #223 (Div. 2) C

    C. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input standa ...

  7. Codeforces 381 简要题解

    做的太糟糕了...第一题看成两人都取最优策略,写了个n^2的dp,还好pre-test良心(感觉TC和CF的pretest还是很靠谱的),让我反复过不去,仔细看题原来是取两边最大的啊!!!前30分钟就 ...

  8. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  9. codeforce 359D 二分+ 动态规划(sparse table)

    原题链接:http://codeforces.com/problemset/problem/359/D 思路:首先对符合题目的长度(r-l)从0到n-1进行二分查找,对每一个长度进行check,看是否 ...

随机推荐

  1. 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..

    1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...

  2. 【转载】一种git commit前自动格式化的方式

    查看原文 简介 这个系列为了解决一个问题:自动化的去管理代码风格和格式 前提:Linux,C语言,Clang 如何在每次commit的时候,将代码风格自动格式化后再提交commit,且格式化的内容必须 ...

  3. 通过DNSLOG回显验证漏洞

    通过DNSLOG回显验证漏洞 前言 实际渗透测试中,有些漏洞因为没有回显导致无法准确判断漏洞是否存在,可能导致渗透测试人员浪费大量精力在一个并不存在的漏洞上,因此为了验证一些无回显漏洞,可结合DNSl ...

  4. linux命名小技巧(持续更新)

    一   向某个文件批量加入内容 1.1 向/etc/wxm文件添加一大段内容可以使用这个命令 [root@registry easyrsa3]# cat <<EOF >varsset ...

  5. kubernets之服务资源

    一  服务集群内部或者客户端与pod的通信桥梁   kubernets集群的内部pod访问为啥不能使用传统的IP:PORT的形式? pod是短暂的,它们会随时启动或者关闭,原因可能是pod所在的节点下 ...

  6. leetcode刷题录-1395

    目录 题目 思考过程 查看别人分享的思路 总结 题目 题目地址:https://leetcode-cn.com/problems/count-number-of-teams/ n 名士兵站成一排.每个 ...

  7. AWS IoT Greengrass是什么?V1和V2版本及其差异

    AWS IoT Greengrass ​ Greengrass主要是用于边缘计算或者机器学习有关,对于详细了解请阅读结尾处的官方文档,文档内容也较为丰富. 目录 AWS IoT Greengrass ...

  8. 2V升3.3V芯片,输出500MA,低功耗10uA解决方案

    2V的输入电压其实非常少,一般都是镍氢电池1.2V,干电池1.5V,来给玩具,MCU单片机,模块啊,等等供电.不过2V的供电电源或者设备确实是不常见的. 一般2V升3.3V,需要升压芯片PW5100即 ...

  9. 获取html中某些标签的值

    一.获取单选按钮radio的值 <!doctype html> <html lang="en"> <head> <meta charset ...

  10. 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境

    庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...