码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-16 20:33:15      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:个数   一个   src   技巧   并且   开始   修改   技术分享   image   

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

标签:个数   一个   src   技巧   并且   开始   修改   技术分享   image   

原文地址:http://www.cnblogs.com/algonote/p/7532447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!