#P12459. [UOI 2024] Zeroing the segment
[UOI 2024] Zeroing the segment
题目描述
本题采用交互式评测方式,目前仅支持 C++ 语言提交。
对于一个长度为 的正整数数组 ,我们定义 如下:
- 初始时设变量 为 ;
- 每次可以花费 1 枚硬币 将 的值增加 ;
- 每次可以花费 1 枚硬币 选择数组中的元素 ()并将其替换为 ,其中 表示 按位异或 运算;
- 表示将所有数组元素同时变为 所需的最少硬币数。
按位异或 运算()的定义:对于非负整数 和 , 的结果是一个非负整数,其二进制表示中某一位为 当且仅当 和 在该位的值不同。例如 $3_{10} \oplus 5_{10} = 0011_{2} \oplus 0101_{2} = 0110_{2} = 6_{10}$。
给定一个长度为 的正整数数组 和 个形如 、 的查询。对于每个查询,需要计算 。
你需要实现以下函数:
void init(integer n, array of integers a)
- —— 表示数组长度的整数;
- —— 长度为 的整数数组;
- 该函数不返回任何值。
integer ask(integer l, integer r)
- —— 表示查询左边界的整数;
- —— 表示查询右边界的整数;
- 该函数返回一个整数 —— 。
array of integers askAll(integer q, array of integers l, array of integers r)
- —— 表示查询数量的整数;
- —— 长度为 的整数数组; 表示第 个查询的左边界;
- —— 长度为 的整数数组; 表示第 个查询的右边界;
- 该函数返回一个整数数组;第 个数应为第 个查询的答案。
这三个函数在 C++ 语言中可以视作:
void init(int n, const vector<long long> &a);
long long ask(int l, int r);
vector<long long> askAll(int q, const vector<int> &l, const vector<int> &r);
输入格式
第一行包含三个整数 、 和 (;)—— 分别表示数字数量、查询数量和查询格式。
第二行包含 个整数 ()—— 数组 的元素。
接下来 行每行包含两个整数 和 ()—— 第 个查询的参数。
函数 将被调用恰好一次。
如果 ,则函数 将被调用恰好一次来处理所有查询。如果 ,则函数 将被调用恰好 次。
输出格式
评测程序将输出 个整数,每个查询的答案各占一行。
输入输出样例 #1
输入 #1
7 6 1
5 4 3 5 7 7 7
1 4
4 7
3 7
1 7
2 6
1 1
输出 #1
9
11
12
14
12
6
输入输出样例 #2
输入 #2
7 6 2
5 4 3 5 7 7 7
1 4
4 7
3 7
1 7
2 6
1 1
输出 #2
9
11
12
14
12
6
说明/提示
评分标准
- ( 分):,且对所有 有 ;
- ( 分):,且对所有 有 ;
- ( 分):,且存在自然数 使得对所有 有 ;
- ( 分):,且对所有 有 ;
- ( 分):,且 ;
- ( 分):,且对所有 有 且 ;
- ( 分):,且 ;
- ( 分):;
- ( 分):,且 ;
- ( 分):。