2019南昌ICPC区域赛-G
九月 12, 2020
题意
给出长度为n<1e5的排列p(1到n都只出现一次)
m<1e4次询问,每次输入一个数k
求一个最短区间[L,R]的长度
使得$∑_{i=L}^R p[i]! $ $mod$ $998857459 >=k$
题解
打表发现当p[i]>=2803时 p[i] mod 998857459 为0
因为实际上模数 998857459 并不是一个素数
所以当n大于2803时,实际上只有 2802个 p[i]需要计算
于是存入2802×2802个区间 根据pair<区间和,区间长度> 升序排列
在每次二分查找一个区间和>=k的下标pos
由于优先以区间和升序排列 区间长度没有准确的递增递减趋势
所以预处理出一个后缀数组suff[i]表示后往前到下标为i的所有区间中长度最短的值
答案输出suff[pos] 若不存在则输出-1
- 为什么只用处理2802×2802个区间
对于每次询问k,首先需要找到存在一个区间的和($∑_{i=L}^R p[i]! $)>=k
显然每个区间长度下只有最大的区间和($∑_{i=L}^R p[i]! $) 才是有用的信息 其他的均可抛弃
其次我们需要找到 相同区间和的情况下最短的区间长度
那么显然只有2802×2802个区间有用
假如有p[i]! mod 998857459 如下:
0 0 5 0 1 0 2
我们选择区间和=6的区间会选择[3,5]而不将0纳入
因为[2,5]和[3,5]区间和都为6但是显然[3,5]长度更短
1 |
|
查看评论