题目背景
请勿用 C++14 (GCC 9) 提交
你需要在程序开头加入如下代码:
题目描述
题目译自 2024년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T2 「과일 게임」
水果游戏是一款将各种水果合并成更大水果的游戏。游戏板可以表示为一个序列 X[0],X[1],⋯,X[K−1],其中每个数字代表一种水果的编号,编号越大,水果越大。
玩家可以执行合并操作,将相邻且相同的两个水果合并成更大的水果。合并操作定义如下:
合并:在表示为 X[0],X[1],⋯,X[K−1] 的游戏板上,选择一个整数 0≤i≤K−2,如果 X[i]=X[i+1],则将游戏板变为 X[0],⋯,X[i−1],X[i]+1,X[i+2],⋯,X[K−1]。
玩家的目标是,在给定初始游戏板的情况下,通过 0 次或多次合并操作,尽可能生成更大的水果。
例如,游戏板 X=[2,1,1,3,2],因为 X[1]=X[2],选择 i=1 进行合并操作,游戏板变为 X=[2,2,3,2]。然后,因为 X[0]=X[1],选择 i=0 进行合并操作,游戏板变为 X=[3,3,2]。最后,因为 X[0]=X[1],选择 i=0 进行合并操作,游戏板变为 X=[4,2]。这样可以得到编号为 4 的水果,这是可以得到的最大水果编号。
给定一个长度为 N 的序列 A,序列中的元素可以在中途发生变化,并且这些变化是累积的。每当给定一个满足 0≤l≤r≤N−1 的整数对 (l,r) 时,你需要计算由 A[l],⋯,A[r] 表示的游戏板上可以得到的最大水果编号。序列的元素变化或给定的整数对的次数总共为 Q 次。
你需要实现以下函数:
A
:大小为 N 的整数数组。
- 该函数只会被调用一次,并且在其他所有函数调用之前调用。
- 如果需要进行预处理或设置全局变量,可以在此函数中实现。
- 该函数应返回由 A[l],⋯,A[r] 组成的游戏板上可以得到的最大水果编号。
- 该函数会被调用多次。
- 该函数应将 A[p] 的值更改为 v。
play_game
函数或 update_game
函数的调用次数总共为 Q 次。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 1 行:N
- 第 2 行:A[0]A[1]⋯A[N−1]
- 第 3 行:Q
- 第 3+i (1≤i≤Q) 行:如果调用
play_game
函数,则为 1 l r
;如果调用 update_game
函数,则为 2 p v
输出格式
示例评测程序输出:
- 第 i 行:第 i 次调用
play_game
函数返回的值
提示
对于所有输入数据,满足:
- 1≤N,Q≤105
- 对于所有 i (0≤i≤N−1),1≤A[i]≤10
- 对于所有
play_game
调用,0≤l≤r≤N−1
- 对于所有
update_game
调用,0≤p≤N−1,1≤v≤10
详细子任务附加限制及分值如下表所示。
子任务 |
分值 |
附加限制 |
1 |
5 |
N≤10,Q≤10 |
2 |
6 |
N≤600,Q≤600 |
3 |
8 |
N≤4000,Q≤4000;对于所有 i (0≤i≤N−1),A[i]≤2;对于所有 update_game 调用,v≤2 |
4 |
15 |
N≤4000,Q≤4000 |
5 |
12 |
对于所有 i (0≤i≤N−1),A[i]≤2;对于所有 update_game 调用,v≤2 |
6 |
14 |
不会调用 update_game |
7 |
40 |
无附加限制 |