[Scoi2015]小凸解密码
Description
小凸得到了一个密码盘,密码盘被等分成N个扇形,每个扇形上有一个数字(0~9),和一个符号(“+”或”*”)
密码盘解密的方法如下:
首先,选择一个位置开始,顺时针地将数字和符号分别记在数组A和数组C巾
B0=A0
当x>0时:
若Cx为“+”,Bx=(Ax+Ax-1)%10,注意:x-1是下标
若Cx为“*”,Bx= (Ax×Ax-1)%10,注意:x-1是下标值
操作完成后,可以得到一个长度为n的数组B,然后以B0为起点将B数组顺时针写成一个环,解密就完成了,称得到的环为答案环。
现在小凸得到了一份指令表,指令表上有2种操作。
一种指令是修改操作,即改变原来密码盘上一个位置的数字和符号。
另一种指令是询问操作,具体如下:
首先从指令给出的位置开始完成解密,得到答案环。
答案环上会有一些0连在一起,将这些连在一起的0称为零区间,找出其中距离B0最远的那个零区间,输出这个距离。
零区问和B0的距离定义为:零区问内所有0到B0距离中的最小值。
Input
第1行包含2个整数n,m,代表密码盘大小和指令个数
接下来n行,每行包含1个整数和1个字符,按顺时针顺序给出了密码盘上的数组和符号
接下来m行,依次给出指令
每行第1个整数代表指令类型
若第1个墼数为1,代表本行对应指令为修改操作,之后依次有2个整数pos,num和1个字符opt,分别代表修改的位置,以及修改后该位置的数字和字符
若第1个整数为2,代表本行对应指令位询问操作,之后有1个整数pos,代表本次操作中解密的开始位置
密码盘上的位置标号为0到n-1
数据保证合法,即数据中0≤pos<N,0≤num≤9,opt为“+”或“*”
Output
对于每个询问操作1行,输出答案,若答案环上没有0,输出-1
Sample Input
5 8
0 *
0 *
0 *
0 *
0 *
2 0
1 0 1 +
1 2 1 +
2 3
1 1 1 +
1 3 1 +
1 4 1 +
2 4
Sample Output
0
2
-1
HINT
对于100%数据,$5 <=n,m≤10^5$
这题容易想到直接维护$0$区间,这里可以使用线段树,也可以直接用set。
每次修改的时候在set里面合并或拆分区间,每次查询的时候直接找距离$x+\frac{n}{2}$最近的区间,然后为了减少特判直接查查左右相邻的几个区间取最大值就行了。
口头ac很简单,但由于要处理环,写起来细节很多,比较麻烦。
代码:
1 |
|