给你一个形式为 "112123123412345 $\dots$ "的无穷序列,它由一个接一个的连续正整数块组成。第一个整数块由 $1$ 到 $1$ 的所有数字组成,第二个整数块由 $1$ 到 $2$ 的所有数字组成,第三个整数块由 $1$ 到 $3$ , $\dots$ 的所有数字组成, 第$i$个整数块由 $1$ 到 $i$ 的所有数字组成。
所以序列的前 $56$ 个元素是 "11212312341234512345612345671234567812345678912345678910"。序列中的元素从 1 开始编号。例如,序列的 $1$ 个元素是 $1$ ,序列的 $3$ 个元素是 $2$ ,序列的 $20$ 个元素是 $5$ ,序列的 $38$ 个元素是 $2$ ,序列的 $56$ 个元素是 $0$ 。
你的任务是回答 $q$ 个独立的查询。在 $i$ -th查询中,你得到了一个整数 $k_i$ 。计算序列中位于 $k_i$ 位置的数字。
">Numerical Sequence (easy version)
Numerical Sequence (easy version)
Created by LXC on Sat Mar 2 11:26:21 2024
https://codeforces.com/problemset/problem/1216/E1
ranting: 1900
tag: binary search, brute force, math
problem
给你一个形式为 “112123123412345 $\dots$ “的无穷序列,它由一个接一个的连续正整数块组成。第一个整数块由 $1$ 到 $1$ 的所有数字组成,第二个整数块由 $1$ 到 $2$ 的所有数字组成,第三个整数块由 $1$ 到 $3$ , $\dots$ 的所有数字组成, 第$i$个整数块由 $1$ 到 $i$ 的所有数字组成。
所以序列的前 $56$ 个元素是 “11212312341234512345612345671234567812345678912345678910”。序列中的元素从 1 开始编号。例如,序列的 $1$ 个元素是 $1$ ,序列的 $3$ 个元素是 $2$ ,序列的 $20$ 个元素是 $5$ ,序列的 $38$ 个元素是 $2$ ,序列的 $56$ 个元素是 $0$ 。
你的任务是回答 $q$ 个独立的查询。在 $i$ -th查询中,你得到了一个整数 $k_i$ 。计算序列中位于 $k_i$ 位置的数字。
solution
离线处理q个查询。
我们维护1到i个数字长度的前缀和,为$p_i$,定义$s_i = \sum \limits_{j=1}^ip_j$
显然对于查询在$s_{i-1}$到$s_{i}$的数来说,可以直接在$p_i$上二分找到答案。
由于查询最多$n=10^9$我们最多只需要维护前$O(\sqrt n)$数量级的前p项和即可。时间复杂度$O(\sqrt n + qlog \sqrt n)$
code
1 |
|