NOIP2017金秋冲刺训练营杯联赛模拟大奖赛Day1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2017金秋冲刺训练营杯联赛模拟大奖赛Day1相关的知识,希望对你有一定的参考价值。

前言:昨天晚上没睡好,导致今天早上起来头疼,于是睡了一多个小时,本来不想比赛了,但是发现第一题的做法实在是太显而易见,于是就愉快的AC了

技术分享

T1

很简单的一道线段树问题

天天去哪吃

题目大意

小天在第i天去了第x[i]号餐厅吃饭,并且在接下来的n/2天内都不能再去这个餐厅去吃饭了,$x[i]=(a*x[i-1]+b*x[i-2]+k)\\%n$  (k是能使x[i]合法的最小值,即x[i]在x[i-n/2~i-1]中没有出现过)

输入

n,m,a,b,x[1],x[2]

输出

x[3],x[4]……x[m]

 

注意到数据之间的关联(大小关系,这个技巧简直太好用了),还有我们需要求解的问题(快速查找$a*x[i-1]*b*x[i-2]%n$在剩余系下在它右边距离最近的合法值),而且还要支持单点修改(把x[i-n/2-1]加入,再把x[i]删除),很明显这是一颗线段树……所以$O(mlogn)$

但是有个问题,如果$(a*x[i-1]+b*x[i-2]+k)\\%n$到$n$之间的所有数都被删完了怎么办,由于剩余系的原因我们还需要从1开始向右接着找……好像有点麻烦是不是?

当然其实我们还有更好的方法,因为剩余系可以抽象成一个环,所以我们可以把这个环破开变成长度为2*n的线段,每次修改x[i]的时候只要同时修改x[i]+n即可

但是还有个问题(问题怎么这么多QWQ),如果查找的过程在线段上跨越了超过n的长度怎么办?其实不用担心,因为剩余系里最多只能同时删掉n/2个数,所以最多只需要跨越n/2的长度就会找到我们需要的数了

代码明天补上

 

以上是关于NOIP2017金秋冲刺训练营杯联赛模拟大奖赛Day1的主要内容,如果未能解决你的问题,请参考以下文章

TYVJ NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解

NOIP2017金秋冲刺训练营杯联赛模拟大奖赛Day1

NOIP模拟赛16

2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1

2017.11.8 Noip2017 考前模拟赛

冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱