codeforces 380A. Sereja and Prefixes(折半查找)
2015-11-29 22:56
351 查看
题目链接: Codeforces Round #223 (Div. 1) 【A. Sereja and Prefixes】
n个操作,类型1,将一个数加到数组后面,类型2,将前l个数字复制c遍,然后加到数组后面
m次询问,每次输出第x个位置的数值
每次操作时用type[]记录类型,len[i]来记录第di次操作的总长度
二分查找位置x,找到这个位置后,如果属于类型1就直接输出,如果属于类型2,就继续查找
n个操作,类型1,将一个数加到数组后面,类型2,将前l个数字复制c遍,然后加到数组后面
m次询问,每次输出第x个位置的数值
每次操作时用type[]记录类型,len[i]来记录第di次操作的总长度
二分查找位置x,找到这个位置后,如果属于类型1就直接输出,如果属于类型2,就继续查找
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; #define ll __int64 #define inf 100005 ll len[inf], type[inf], a[inf], c[inf], x; int n,m; int search(ll x) { int l = 1, r = n; while(l < r) { int mid = (l+r)>>1; if(len[mid] < x) l = mid+1; else r = mid; } if(type[l] == 1) return a[l]; x = x-len[l-1]; x = x%a[l]; if(x == 0) x = a[l]; return search(x); } int main() { memset(type, 0, sizeof(type)); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &type[i]); if(type[i] == 1) { scanf("%d", &a[i]); len[i] = len[i-1]+1; } else { scanf("%d%d", &a[i], &c[i]); len[i] = len[i-1]+(ll)a[i]*c[i]; } } scanf("%d", &m); for(int i = 0; i < m; i++) { scanf("%I64d", &x); if(i == m-1) printf("%d\n",search(x)); else printf("%d ", search(x)); } return 0; }
相关文章推荐
- Apache服务的主要目录和配置文件详解
- achartengine画出动态折线图
- Windows Data Types
- pAdPt_-7 Hello BaiduMap [配置百度地图移动版开发环境(Android Studio)]
- HDU15年新生赛 1005 ACM组队安排(DP+组合公式)
- php memcache环境搭建
- docker 中 NGINX+PHP+MYSQL+REDIS+Elasticsearch 环境搭建 (linux系统)
- c# 使用sharppcap实现 网络抓包
- HBase--DependentColumnFilter(参考例过滤器 )详解
- 第二个Sprint冲刺第七天
- LeetCode 9 : Palindrome Number (Java)
- 通过ssh验证配置git服务端
- 简单实现用户注册,登录的留言簿
- 通过树莓派的无线网卡与pc的tcp助手通讯实验
- malloc,calloc,realloc用法小结
- 如何在oracle 12c中创建普通用户
- Java 容器学习
- poj 1185 状态压缩dp
- CPP 6th 读书笔记——类(1)
- java基础之序列化