救一下,题目自己写的,过不去
  • 板块学术版
  • 楼主wuyuyaostxq
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/26 11:07
  • 上次更新2024/10/26 12:44:15
查看原帖
救一下,题目自己写的,过不去
1239529
wuyuyaostxq楼主2024/10/26 11:07

题目描述 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

#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;  
}
//逆天马蜂见谅
2024/10/26 11:07
加载中...