luogu#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],X[1],,X[K1]X[0], X[1], \cdots, X[K-1],其中每个数字代表一种水果的编号,编号越大,水果越大。

玩家可以执行合并操作,将相邻且相同的两个水果合并成更大的水果。合并操作定义如下:

合并:在表示为 X[0],X[1],,X[K1]X[0], X[1], \cdots, X[K-1] 的游戏板上,选择一个整数 0iK20 \leq i \leq K-2,如果 X[i]=X[i+1]X[i]=X[i+1],则将游戏板变为 $X[0], \cdots, X[i-1], X[i]+1, X[i+2], \cdots, X[K-1]$。

玩家的目标是,在给定初始游戏板的情况下,通过 00 次或多次合并操作,尽可能生成更大的水果。

例如,游戏板 X=[2,1,1,3,2]X=[2,1,1,3,2],因为 X[1]=X[2]X[1]=X[2],选择 i=1i=1 进行合并操作,游戏板变为 X=[2,2,3,2]X=[2,2,3,2]。然后,因为 X[0]=X[1]X[0]=X[1],选择 i=0i=0 进行合并操作,游戏板变为 X=[3,3,2]X=[3,3,2]。最后,因为 X[0]=X[1]X[0]=X[1],选择 i=0i=0 进行合并操作,游戏板变为 X=[4,2]X=[4,2]。这样可以得到编号为 44 的水果,这是可以得到的最大水果编号。

给定一个长度为 NN 的序列 AA,序列中的元素可以在中途发生变化,并且这些变化是累积的。每当给定一个满足 0lrN10 \leq l \leq r \leq N-1 的整数对 (l,r)(l, r) 时,你需要计算由 A[l],,A[r]A[l], \cdots, A[r] 表示的游戏板上可以得到的最大水果编号。序列的元素变化或给定的整数对的次数总共为 QQ 次。

你需要实现以下函数:

void prepare_game(std::vector<int> A);
  • A:大小为 NN 的整数数组。
  • 该函数只会被调用一次,并且在其他所有函数调用之前调用。
  • 如果需要进行预处理或设置全局变量,可以在此函数中实现。
int play_game(int l, int r);
  • 该函数应返回由 A[l],,A[r]A[l], \cdots, A[r] 组成的游戏板上可以得到的最大水果编号。
  • 该函数会被调用多次。
void update_game(int p, int v);
  • 该函数应将 A[p]A[p] 的值更改为 vv
  • play_game 函数或 update_game 函数的调用次数总共为 QQ 次。

注意,提交的代码中不应包含任何输入输出操作。

输入格式

示例评测程序按以下格式读取输入:

  • 11 行:NN
  • 22 行:A[0]A[1]A[N1]A[0]\,A[1]\,\cdots\,A[N-1]
  • 33 行:QQ
  • 3+i3+i (1iQ)(1 \leq i \leq Q) 行:如果调用 play_game 函数,则为 1 l r;如果调用 update_game 函数,则为 2 p v

输出格式

示例评测程序输出:

  • ii 行:第 ii 次调用 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

提示

对于所有输入数据,满足:

  • 1N,Q1051 \leq N, Q \leq 10^5
  • 对于所有 ii (0iN1)(0 \leq i \leq N-1)1A[i]101 \leq A[i] \leq 10
  • 对于所有 play_game 调用,0lrN10 \leq l \leq r \leq N-1
  • 对于所有 update_game 调用,0pN1,1v100 \leq p \leq N-1, 1 \leq v \leq 10

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 55 N10,Q10N \leq 10,Q \leq 10
22 66 N600,Q600N \leq 600,Q \leq 600
33 88 N4000,Q4000N \leq 4000,Q \leq 4000;对于所有 ii (0iN1)(0 \leq i \leq N-1)A[i]2A[i] \leq 2;对于所有 update_game 调用,v2v \leq 2
44 1515 N4000,Q4000N \leq 4000,Q \leq 4000
55 1212 对于所有 ii (0iN1)(0 \leq i \leq N-1)A[i]2A[i] \leq 2;对于所有 update_game 调用,v2v \leq 2
66 1414 不会调用 update_game
77 4040 无附加限制