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