51nod 1422 沙拉酱前缀
沙拉酱非常喜欢数字序列。这正是他要弄一个关于构造序列的算法的原因。
沙拉酱拿了一张白纸。然后他开始用m个步骤来制作一个序列。每一步他要么向这个序列的末尾添加一个数字,要么拿这个序列的开头l个数字,然后在末尾添加c次。对于第二种操作,一般的,如果当前序列是 a1,a2,...,an ,那么经过操作之后序列将变成 a1,a2,...,an[,a1,a2,...,al] (方括号里面的内容会重复c次)。
一天过去了,沙拉酱也完成了他的序列。现在他想知道某个位置是什么数字。
单组测试数据。 第一行包含一个整数m (1 ≤ m ≤ 10^5),表示构造序列的步骤数目。 接下来m行包含每一个步骤的信息。第一个数字是类型(1或2)。类型1表示在序列后面加一个数字,这种情况下后面会跟一个整数xi (1 ≤ xi ≤ 10^5),表示被加在后面的数字。类型2表示复制一段长度为 li 前缀然后接到后面 ci 次,这种情况下后面会跟两个整数 li, ci(1 ≤ li ≤ 10^5, 1 ≤ ci ≤ 10^4),li 是前缀的长度,ci是复制的次数。输入中保证li不会大于当前序列的长度。接下来一行包含一个整数n (1 ≤ n ≤ 10^5),表示查询的数量。接下来一行中包含n个正整数,每一个整数表示要查询的位置。题目保证这些数字大小不会超过序列的长度。序列的下标从1开始。
对于每一个查询,输出对应查询位置的数字。两个查询之间用空格分开。具体格式看样例。
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
1 2 1 2 3 1 2 1 2 3 1 2 1 2 3 4
一道有点奇奇怪怪的题目?
刚开始以为是数据结构
看了题解才知道一个二分递归就可以了
真 以后看到1e5就要想到二分.jpg
二分一下要寻找的位置在哪个操作里
算出该位置的值的位置
然后递归下去
AC之后我闲来无事又加了一个小范围(1e7)的记忆化(然而并没有什么明显的效果)
#include<cstring>
const int N=1e5+10;
struct node
{long long l,r;bool tag;int num;
}e[N];
int n,m;
int find(long long x)
{int ll=1,rr=m;int ans=0;while(rr-ll>1){int mid=(ll+rr)>>1;if(x<e[mid].l) rr=mid-1;else if(x>e[mid].r) ll=mid+1;else {ans=mid;break;}}if(!ans){if(e[ll].l<=x&&x<=e[ll].r) ans=ll;else ans=rr;}
// printf("std::%d\n",ans);if(!e[ans].tag) return e[ans].num;long long cha=x-e[ans].l+1;cha=cha%e[ans].num;if(!cha) cha=e[ans].num;
// printf("std::%lld\n",cha);return find(cha);
}
int main()
{int p,q;int opt;scanf("%d",&m);for(int i=1;i<=m;++i){scanf("%d %d",&opt,&p);if(opt==1) e[i].l=e[i].r=e[i-1].r+1,e[i].tag=0,e[i].num=p;else scanf("%d",&q),e[i].l=e[i-1].r+1,e[i].r=e[i].l+p*q-1,e[i].tag=1,e[i].num=p;
// printf("std::%lld %lld\n",e[i].l,e[i].r);}scanf("%d",&n);long long x;for(int i=1;i<=n;i++){scanf("%lld",&x);printf("%d ",find(x));}return 0;
}
51nod 1422 沙拉酱前缀相关推荐
- 51nod-1422:沙拉酱前缀
1422 沙拉酱前缀 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 沙拉酱非常喜欢数字序列.这正是他要弄一个关于 ...
- 51nod 1277 KMP 前缀出现次数
51NOD 1277:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277 跟HDU 6153还挺像的:http://w ...
- 51nod 1065 最小正字段和 解决办法:set存前缀和,二分插入和二分查找
题目: 这题要求大于0的最小字段和,常规O(n)求最大字段和的方法肯定是没法解的. 我的解法是:用sum[i]存前i项的和,也就是前缀和. 这题就变成了求sum[j]-sum[i]的大于0的最小值( ...
- 51nod 1098 最小方差 排序+前缀和+期望方差公式
题目: 题目要我们,在m个数中,选取n个数,求出这n个数的方差,求方差的最小值. 1.我们知道,方差是描述稳定程度的,所以肯定是着n个数越密集,方差越小. 所以我们给这m个数排个序,从连续的n个数中找 ...
- 51nod 1103 N的倍数 思路:抽屉原理+前缀和
题目: 这是一道很神奇的题目,做法非常巧妙.巧妙在题目要求n个数字,而且正好要求和为n的倍数. 思路:用sum[i]表示前i个数字的和%n.得到sum[ 1-N ]共N个数字. N个数字对N取模,每个 ...
- 51nod 1393 0和1相等串 思路 : map存前缀和
题目: 思路:把'0'当成数字-1,'1'当成数字1,求前缀和,用map更新当前前缀和最早出现的位置.(用map而不用数组是因为可能会出现负数) 当前缀和的值之前出现过,比如i = 10时,sum = ...
- 51nod 1344 走格子【贪心/前缀和】
1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...
- 【51nod - 1098】 最小方差(基础数学,公式化简,前缀和,积的前缀和)
题干: 若x1,x2,x3--xn的平均数为k. 则方差s^2 = 1/n * [(x1-k)^2+(x2-k)^2+--.+(xn-k)^2] . 方差即偏离平方的均值,称为标准差或均方差,方差描述 ...
- 【51nod - 前缀异或】 对前缀和的理解
题干: 前缀异或 基准时间限制:2 秒 空间限制:131072 KB 分值: 5 输入一个长度为n(1 <= n <= 100000)数组a[1], a[2], ..., a[n]. 输 ...
最新文章
- log4j(七)——log4j.xml简单配置样例说明
- 数据分析系列精彩浓缩(二)
- python中文件分类_Python中的类是否在不同的文件中?
- [原]FreeSWITCH uuid_transfer both转移失败(三方通话),如何解决?
- 如何使用Dirsearch探测Web目录
- Mysql DBA 高级运维学习之路-DML语句之insert知识讲解
- rocketmq源码调试
- java 常量池技术
- matlab电气教程下载,Matlab 2020b介绍及下载安装步骤
- 架构之美-读书笔记之一
- Linux服务器下载Redis
- Linux 的du和df命令
- Asp 解析 XML并分页显示
- 传统安防监控直播的四分屏的前端展示代码
- 云上生活——数字经济万物互联
- 用计算机软件绘制思维导图和手绘思维导图,用计算机软件绘制思维导图和手绘思维导图各有优势。()...
- The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on .
- 【大疆智图】| 重建三维模型
- 大学里机器人比赛的那些事
- 好嗨游戏:20款史上最佳的MMORPG游戏,看看有没有你知道的?
热门文章
- NFPA 855-2020+勘误+增补【中文】 固定式储能系统的安装标准
- ShaderLearning_3_UnityShader基本架构
- 互联网摸鱼日报(2022-12-22)
- 国内技术网站逛腻了?国外程序员常浏览的 8 大网站,了解一下
- Kong系列-05-使用入门
- 百度地图 驾车导航用来生成路线 轨迹回放(LuShu)
- 【无标题】光纤收发器TX、RX分别表示什么?区分单纤双纤收发器的方法
- 按回车键光标自动移动到下一个输入框。
- java 使用GeoTools工具 geojson 与shp 相互转换
- 1 Robotics: Aerial Robotics 第3+4周 课程学习记录及课后习题解答