#HK5169. 「POI2020 IOI Selection」Powtórzenia
「POI2020 IOI Selection」Powtórzenia
注意事项
在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:
- C++(标准为 C++ 17 及以上)
请在提交源代码前添加 #include "powlib.h"。
题目描述
题目译自 XXVII Olimpiada Informatyczna – Eliminacje do IOI Powtórzenia
每年圣诞节,Bajtazar 都会用一串五颜六色的灯链来装饰他的家。今年,Bajtazar 亲自挑选了灯链上灯泡的颜色,但他在选择时犹豫不决,最终导致灯链做得过长,显得有些冗余。
Bajtazar 的妻子在一个热门网站上读到,今年的圣诞时尚趋势要求灯链中包含尽可能多不同的重复序列。所谓重复序列,是指灯链中两个或更多连续灯泡具有相同颜色的情况。重复序列被认为是不同的,如果它们由不同颜色的灯泡组成,或者长度不同。例如,在灯链序列 中(其中数字 和 代表不同颜色),包含了 种不同的重复序列:
Bajtazar 打算通过去掉灯链开头和/或结尾的一部分灯泡来缩短灯链,但他希望知道在进行这样的操作后,灯链中会保留多少种不同的重复序列。由于他尚未确定具体要移除多少灯泡,因此需要一个函数库,帮助他计算在不同移除方案下得到的重复序列数量。
交互方式
你的函数库需要提供以下功能:
-
initiuj(n, t)
该函数在程序开始时只会被调用一次。你可以通过它获取灯链中灯泡的总数 以及各灯泡的颜色信息(通过向量 提供)。灯泡颜色用从 到 的整数表示。灯泡编号与向量 的索引一致,从 到 。- C++:
void inicjuj(int n, vector<int> t);
- C++:
-
ile_powtorzen(a, b)
调用此函数意味着询问灯链从第 个灯泡到第 个灯泡(包含两端,)这一段中,不同重复序列的数量。- C++:
int ile_powtorzen(int a, int b);
- C++:
注意你的程序不得从标准输入或文件读取任何数据,也不得向文件或标准输出写入任何内容。可以向标准错误输出(stderr)写入诊断信息,但请注意这会消耗宝贵的运行时间。不要声明 main 函数。
样例
| 操作 | 结果 | 说明 |
|---|---|---|
initiuj(10, [1,1,1,1,2,2,2,1,1,1]) |
- | |
ile_powtorzen(0, 9) |
查询整个灯链序列 | |
ile_powtorzen(0, 6) |
查询片段 | |
ile_powtorzen(4, 6) |
查询片段 | |
ile_powtorzen(3, 4) |
查询片段 |
附加样例
- ,,灯泡颜色为 ;
- ,,灯泡颜色为 ;查询满足子任务 的限制;
- ,,灯泡颜色为一个颜色 ,两个颜色 ,三个颜色 ,以此类推……
示例评测程序
示例错误解法及示例函数库可在「文件」中找到。这些函数库可能与评测系统中的行为不同,且不一定满足任务要求,仅用于展示程序交互方式。
编译命令如下,假设 powgrader.cpp 文件与你的解决方案位于同一目录下:
g++ -O3 -static pow.cpp powgrader.cpp -std=c++17
编译后的程序将从标准输入读取查询数据,并在标准输出中逐行输出 ile_powtorzen 查询的结果。输入格式如下:
- 第一行:查询总数 (包括调用
initiuj函数的一次); - 第二行:字母
i,数字 ,以及随后 个数字表示各灯泡的颜色; - 接下来的 行:每行包含字母
p,以及两个数字 和 ,描述一次ile_powtorzen(a, b)查询。
数据范围与提示
设 为总查询数(含 inicjuj)。在所有子任务中,均满足 ,。
详细子任务附加限制及分值如下表所示。
| 子任务 | 附加限制 | 分值 |
|---|---|---|
所有查询 ile_powtorzen 中的片段长度相同 |
||
| 灯泡只有两种颜色 | ||
查询 ile_powtorzen 中的参数 和 都是非递减的 |
||
查询 ile_powtorzen 中的参数 是非递减的 |
||
| 无附加限制 |