社区讨论
救一下,题目自己写的,过不去
学术版参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m2pkz5g2
- 此快照首次捕获于
- 2024/10/26 11:07 去年
- 此快照最后确认于
- 2025/11/04 16:06 4 个月前
题目描述
babab是个喜欢位运算的孩子。
今天,她需要计算
n 个整数的异或和
a
1
⊕
a
2
⊕
⋯
⊕
a
n
a
1
⊕a
2
⊕⋯⊕a
n
。
为了更方便地计算,她决定先将式子抄写到草稿纸上。但在抄写到某个符号的时候,她的圆珠笔突然没水了!于是,恰好一个异或符号
⊕ 被抄成了加法符号
+。
可怜的 dXqwq 并没有注意到这一点,她仍然按照从左到右的方式计算了式子的值,也就是
(
(
(
(
(
(
a
1
⊕
a
2
)
⊕
a
3
)
⊕
⋯
)
+
a
x
)
⊕
a
x
+
1
)
⊕
⋯
)
⊕
a
n
((((((a
1
⊕a
2
)⊕a
3
)⊕⋯)+a
x
)⊕a
x+1
)⊕⋯)⊕a
n
。
现在她决定将错就错:她希望你算出所有可能的算式的最小值和最大值,来帮她检查她是否还在计算中犯了更多的错误。
输入格式
从文件 mistake.in 中读入数据。
第一行输入一个整数
n。
第二行输入
n 个整数
a
i
。
输出格式
输出到文件 mistake.out 中。
输出一行两个整数,分别代表可能得到结果的最小值和最大值。
2≤n≤10^5,0≤ai<2^31
CPP#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
int n;
cin >> n;
freopen("mistake.in", "r", stdin);
freopen("mistake.out", "w", stdout);
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<int> pre(n + 1);
for (int i = 0; i < n; ++i) {
pre[i + 1] = pre[i] ^ a[i];
}
int max_result = INT_MIN;
int min_result = INT_MAX;
for (int x = 0; x < n; ++x) {
int left_xor = pre[x];
int right_xor = pre[n] ^ pre[x + 1];
int current_result = left_xor + a[x] ^ right_xor;
max_result = max(max_result, current_result);
min_result = min(min_result, current_result);
}
cout << min_result << " " << max_result << endl;
return 0;
}
//逆天马蜂见谅
回复
共 4 条回复,欢迎继续交流。
正在加载回复...