社区讨论

救一下,题目自己写的,过不去

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...