#P15792. 「1&0OI R1」三月雨

「1&0OI R1」三月雨

题目背景

这是一道函数式交互题。请使用合适版本的 C++ 提交,建议不要使用 C++14 (GCC 9)。

$\text{念往昔 \textcolor{66CCFF}我急旋慢转\textcolor{EE0000}你抚琴低吟}$

到如今 重唱此曲却已无\text{{到如今 重唱此曲却已无}\textcolor{EE0000}你}

$\text{莫叹息 \textcolor{66CCFF}我再舞一曲\textcolor{EE0000}你意乱情迷}$

空余忆 良辰美景多可惜\text{空余忆 \textcolor{AA6680}{良辰美景}多可惜}

过往的场景渐渐在某些方面模糊,在另一些方面却回响得愈发清晰。

即使相处的一切在日复一日的孤独中逐渐碎散,却仍未习惯身边失落的曾经存在的温度。

当试图吟哼镌刻着良辰美景的旧曲时,才发现太久的离别已使珍惜的记念闪烁不定。

不……不能忘却……

潸然的泪织成了细密的网,隔绝着窗外静谧的春夜。

题目描述

1\text{\textcolor{66CCFF}{1}} 常常追忆过去。

她现在正在试图想起 0\text{\textcolor{EE0000}{0}} 为她弹奏的那首曲子。曲子可以被看做一个由 nn 个音符组成的序列 aa索引从 00 开始,其中的每个音符 ai(0i<n)a_i(0 \le i < n) 可以用一个非负整数来代表。

不幸的是,由于缺乏绝对音感加之离别日久,她已经忘却了每个 aia_i 具体是什么,这给她的追忆旅程带来极大挑战。

然而,她仍留存着某『感觉』。感觉是一个数值,与乐段内每一个音符有关。对于一个从乐曲第 ll 个音符开始到第 rr 个音符结束的乐段 [l,r][l,r],她有两种感觉:

  • 一种感觉是这个乐段每对不同音符的按位与的和,即 $\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}$。

这里,“每对”为无序对。and\operatorname{and}xor\operatorname{xor} 分别表示按位与运算和按位异或运算。

由于 0\text{\textcolor{EE0000}{0}} 曾经非常多次以不同的开始和结尾向 1\text{\textcolor{66CCFF}{1}} 演奏曲子,所以 1\text{\textcolor{66CCFF}{1}} 确信对于任意的 0l<r<n0 \le l < r < n,她都还记得乐段 [l,r][l,r] 的两种感觉。注意这个乐段的长度至少为 22

因为过度悲伤,1\text{\textcolor{66CCFF}{1}} 的 OI 水平急剧下降,无法推算还原出曲子的模样,请你帮助她!你可以向她咨询她对于一些乐段的感觉,并最后告诉她原曲每个音符是什么。

形式化地,有一个长为 nn未知序列 a(a0,,an1)a(a_0,\ldots,a_{n-1}),定义 $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}$。你可以进行若干次操作,每次操作为给定 0l<r<n0 \le l < r < n 并查询 fand(l,r)f_{\operatorname{and}}(l,r)fxor(l,r)f_{\operatorname{xor}}(l,r)。你最后需要确定 a0,,an1a_0,\ldots,a_{n-1} 的值并返回序列 aa


【交互格式】

你不需要也不应该实现 main 函数。

你需要实现以下函数:

  • std :: vector<int> sanyueyu(int n);
    • 参数 nn 表示乐曲的长度;
    • 其应该返回一个持有 int 类型的 vector,长度为 nn,且该 vector 的第 ii 个元素为 aia_i

你可以调用如下函数:

  • long long ask_and(int l, int r);
  • long long ask_xor(int l, int r);
    • 参数 llrr 均表示询问乐段的左右端点。

    • 分别返回乐段 [l,r][l,r] 的第一种『感觉』和第二种『感觉』的值,即 fand(l,r)f_{\operatorname{and}}(l,r)fxor(l,r)f_{\operatorname{xor}}(l,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; 
}

输入格式

以下为交互库的输入格式,你的程序不需要,也不应该从标准输入读入任何数据。

第一行输入两个整数 n,tn,tnn 含义如题所述,tt 与你的测试点的得分有关,具体含义见【评分标准】。

第二行输入 nn 个整数,依次代表 a0an1a_0\ldots a_{n - 1}

输出格式

交互库会与 Special Judge 部分进行交互,以使 Special Judge 返回特定的分数和错误信息。

你的程序不需要,也不应该向标准输出输出任何数据。

提示

【评分标准】

对于每个测试点,你的程序若满足以下任意一条条件,将获得 00 分:

  1. 你的程序 CE/RE/TLE/MLE/UKE 了。
  2. 你某一次调用 ask_andask_xor 时传入的 llrr 不满足 0l<r<n0 \le l < r < n
  3. 你返回的 vector 长度不为 nn
  4. 对于你返回的 vector,存在一个 i(0i<n)i(0 \le i < n),使得你的 vectorii 项不为 aia_i

对于情况 2~4,测试点将显示为 WA,并且尽管比赛中不会显示,1\text{\textcolor{66CCFF}{1}} 仍然会告诉你错误信息,分别为 Error:2Error:3Error:4,优先级递减。

否则,你将在该测试点获得分数。对于每个测试点,有一个特定的参数 tt。设你的程序在该测试点调用 ask_andask_xor 的总次数为 cc

  • 如果 ctc \le t,那么你将获得该测试点 100%100\% 的分数。
  • 否则,你将获得 10%10\% 的分数,测试点将显示为 WA,并返回 Error:1(比赛时同样不可见)。

【数据范围】

对于所有测试点,有:

  • 3n1053 \le n \le 10^5;
  • 0ai1060 \le a_i \le 10^6
  • tn+1t \ge n + 1

每个测试点的具体数据范围见下表。

::cute-table{tuack}

测试点编号 n=n= t=t= aia_i \le
11 33 66 1010
22 ^ 55 10610^6
33 44 ^
44 88 1010
55 ^ ^ 10610^6
66 66 ^
77 55
88 10510^5 105×210 ^ 5\times2
99 ^ 105+210^5+2
1010 105+110^5+1

【checker 与交互库】

为方便选手调试,本题提供了一个 checker,在附件中。它的输入格式与上文【输入格式】部分的格式相同。

使用时,你可以将你的代码粘贴到 checker 开头,或以任意合理的方式嵌入你的代码,然后运行 checker 并输入自造数据。

如果你的程序通过了该组自造数据,checker 的输出信息将以 Accept! 打头;否则将会以 Error:1~Error:4 打头,这些前缀的含义同【评分标准】。

checker 还会给出一些其他有利于调试的信息,请自行阅读这些信息以理解其含义。

请注意,交互库的实现与 checker 完全不同,你的代码不应依赖 checker 的具体实现。

作为参考,交互库调用一次 ask_andask_xor 的时间复杂度均为 O(logmax{ai})O(\log \max \{a_i\})。如果你的程序时间复杂度正确,交互库应该能在规定的时间内完成对你的程序的判定。