#P15792. 「1&0OI R1」三月雨
「1&0OI R1」三月雨
题目背景
这是一道函数式交互题。请使用合适版本的 C++ 提交,建议不要使用 C++14 (GCC 9)。
$\text{念往昔 \textcolor{66CCFF}我急旋慢转\textcolor{EE0000}你抚琴低吟}$
$\text{莫叹息 \textcolor{66CCFF}我再舞一曲\textcolor{EE0000}你意乱情迷}$
过往的场景渐渐在某些方面模糊,在另一些方面却回响得愈发清晰。
即使相处的一切在日复一日的孤独中逐渐碎散,却仍未习惯身边失落的曾经存在的温度。
当试图吟哼镌刻着良辰美景的旧曲时,才发现太久的离别已使珍惜的记念闪烁不定。
不……不能忘却……
潸然的泪织成了细密的网,隔绝着窗外静谧的春夜。
题目描述
常常追忆过去。
她现在正在试图想起 为她弹奏的那首曲子。曲子可以被看做一个由 个音符组成的序列 ,索引从 开始,其中的每个音符 可以用一个非负整数来代表。
不幸的是,由于缺乏绝对音感加之离别日久,她已经忘却了每个 具体是什么,这给她的追忆旅程带来极大挑战。
然而,她仍留存着某『感觉』。感觉是一个数值,与乐段内每一个音符有关。对于一个从乐曲第 个音符开始到第 个音符结束的乐段 ,她有两种感觉:
-
一种感觉是这个乐段每对不同音符的按位与的和,即 $\displaystyle\sum_{l \le i < j \le r}{a_i \operatorname{and} a_j}$。
-
一种感觉是这个乐段每对不同音符的按位异或的和,即 $\displaystyle\sum_{l \le i < j \le r}{a_i \operatorname{xor} a_j}$。
这里,“每对”为无序对。 和 分别表示按位与运算和按位异或运算。
由于 曾经非常多次以不同的开始和结尾向 演奏曲子,所以 确信对于任意的 ,她都还记得乐段 的两种感觉。注意这个乐段的长度至少为 。
因为过度悲伤, 的 OI 水平急剧下降,无法推算还原出曲子的模样,请你帮助她!你可以向她咨询她对于一些乐段的感觉,并最后告诉她原曲每个音符是什么。
形式化地,有一个长为 的未知序列 ,定义 $f_{\operatorname{and}}(l,r) = \sum_{l \le i < j \le r}{a_i \operatorname{and} a_j}$ 及 $f_{\operatorname{xor}}(l,r) = \sum_{l \le i < j \le r}{a_i \operatorname{xor} a_j}$。你可以进行若干次操作,每次操作为给定 并查询 或 。你最后需要确定 的值并返回序列 。
【交互格式】
你不需要也不应该实现 main 函数。
你需要实现以下函数:
std :: vector<int> sanyueyu(int n);- 参数 表示乐曲的长度;
- 其应该返回一个持有
int类型的vector,长度为 ,且该vector的第 个元素为 。
你可以调用如下函数:
long long ask_and(int l, int r);long long ask_xor(int l, int r);-
参数 和 均表示询问乐段的左右端点。
-
分别返回乐段 的第一种『感觉』和第二种『感觉』的值,即 和 。
-
由于洛谷的交互机制,你应该将这些函数的原型声明在文件开头:
std :: vector<int> sanyueyu(int n);
long long ask_and(int l, int r);
long long ask_xor(int l, int r);
以下是一个您的程序可能的结构:
// 这里引入你需要的头文件
/*
这里放置你要声明的全局变量
*/
std :: vector<int> sanyueyu(int n);
long long ask_and(int l, int r);
long long ask_xor(int l, int r);
std :: vector<int> sanyueyu(int n){
std :: vector<int> ans;
/*
这里放置你的解题代码
*/
return ans;
}
输入格式
以下为交互库的输入格式,你的程序不需要,也不应该从标准输入读入任何数据。
第一行输入两个整数 。 含义如题所述, 与你的测试点的得分有关,具体含义见【评分标准】。
第二行输入 个整数,依次代表 。
输出格式
交互库会与 Special Judge 部分进行交互,以使 Special Judge 返回特定的分数和错误信息。
你的程序不需要,也不应该向标准输出输出任何数据。
提示
【评分标准】
对于每个测试点,你的程序若满足以下任意一条条件,将获得 分:
- 你的程序 CE/RE/TLE/MLE/UKE 了。
- 你某一次调用
ask_and或ask_xor时传入的 和 不满足 。 - 你返回的
vector长度不为 。 - 对于你返回的
vector,存在一个 ,使得你的vector第 项不为 。
对于情况 2~4,测试点将显示为 WA,并且尽管比赛中不会显示, 仍然会告诉你错误信息,分别为 Error:2、Error:3 和 Error:4,优先级递减。
否则,你将在该测试点获得分数。对于每个测试点,有一个特定的参数 。设你的程序在该测试点调用 ask_and 和 ask_xor 的总次数为 :
- 如果 ,那么你将获得该测试点 的分数。
- 否则,你将获得 的分数,测试点将显示为 WA,并返回
Error:1(比赛时同样不可见)。
【数据范围】
对于所有测试点,有:
- ;
- ;
- 。
每个测试点的具体数据范围见下表。
::cute-table{tuack}
| 测试点编号 | |||
|---|---|---|---|
| ^ | |||
| ^ | |||
| ^ | ^ | ||
| ^ | |||
| ^ | |||
【checker 与交互库】
为方便选手调试,本题提供了一个 checker,在附件中。它的输入格式与上文【输入格式】部分的格式相同。
使用时,你可以将你的代码粘贴到 checker 开头,或以任意合理的方式嵌入你的代码,然后运行 checker 并输入自造数据。
如果你的程序通过了该组自造数据,checker 的输出信息将以 Accept! 打头;否则将会以 Error:1~Error:4 打头,这些前缀的含义同【评分标准】。
checker 还会给出一些其他有利于调试的信息,请自行阅读这些信息以理解其含义。
请注意,交互库的实现与 checker 完全不同,你的代码不应依赖 checker 的具体实现。
作为参考,交互库调用一次 ask_and 和 ask_xor 的时间复杂度均为 。如果你的程序时间复杂度正确,交互库应该能在规定的时间内完成对你的程序的判定。