题解:P11506 [ROIR 2017 Day 1] 校园
题目:[ROIR 2017 Day 1] 校园
题意
一个表格有
下图是一种
思路
如果对于每一次询问,直接按照题意模拟填数的话,时间复杂度为
考虑优化,规定每填
我们可以预处理出每一列填入数字的数量和一个完整周期内填入数字的数量
接下来对于每次询问
-
在周期之内,计算经历了几个完整的周期,直接用
{a_i}^{\prime} 整除S_k 即可。这一部分答案为周期数乘以周期k 。 -
在周期以外,因为每个周期前
k-1 格均为y 情况,最后1 格为x 情况,我们先判断其是否在周期的最后1 行,如果是,这一部分答案即为周期k 。反之则前面每一格内数量均为y ,使用周期外数字的数量除以y ,判断一下是否整除即可。
以样例为例,
核心判断语句如下:
ll query(ll a){
if(a==0) return n;
ll block=a/Sk,tmp=block*Sk;// block 代表经历了几个完整周期, tmp 代表前面的周期有多少个数
//printf("%lld block:%lld tmp:%lld\n",a,block,tmp);
a-=tmp;
if(a<=(k-1)*y){//全 y
if(a%y) return block*k+a/y+1;
else return block*k+a/y;
}else{//含有 x & y
return block*k+k;
}
}
代码
评测记录:https://www.luogu.com.cn/record/197131297
代码(C++):https://www.luogu.com/paste/0ulbm2nd
闲话
很好的签到题,注意