蓝桥杯真题讲解:异或和之和 (拆位、贡献法)

蓝桥杯真题讲解:异或和之和 (拆位、贡献法)

一、视频讲解

蓝桥杯真题讲解:异或和之和 (拆位、贡献法)
在这里插入图片描述

二、正解代码

//拆位考虑
#include<bits/stdc++.h>
#define endl "\n"
#define pb push_back
#define deb(x) cout << #x << " = " << x << '\n';
#define INF 0x3f3f3f3f
#define int long long
using namespace std;

void solve()
{
	int n; cin >> n;
	vector<int>a(n);
	for(int i = 0; i < n; i ++){
		cin >> a[i];
	}
	int ans = 0;
	for(int i = 20; i >= 0; i -- ){
		int s = 0, n0 = 1, n1 = 0;
		for(int j = 0; j < n; j ++){
			int bit = (a[j] >> i) & 1;
			s += bit;
			if(s % 2){
				ans += (1 << i) * n0;
				n1 ++;
			}else{
				ans += (1 << i) * n1;
				n0 ++;
			}
		}	
	}
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t = 1;
	//cin >> t;
	while(t--)
	solve();
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是对Java位运算和枚举的简要解释: ### 位运算 位运算是对二进制数进行操作的运算符。Java中包含六种位运算符: 1. 与运算(&):将两个二进制数的每一位进行与操作,当且仅当两个数对应的位都为1时,结果的对应位才为1。 2. 或运算(|):将两个二进制数的每一位进行或操作,当两个数对应的位中有至少一个为1时,结果的对应位就为1。 3. 异或运算(^):将两个二进制数的每一位进行异或操作,当且仅当两个数对应的位不相同时,结果的对应位才为1。 4. 取反运算(~):将一个二进制数的每一位取反,即0变为1,1变为0。 5. 左移位运算(<<):将一个二进制数向左移动指定的位数,右侧空位补0。 6. 右移位运算(>>):将一个二进制数向右移动指定的位数,左侧空位补符号位(即如果原二进制数最高位为1,则移动后的空位补1,否则补0)。 位运算在Java中的应用场景很多,例如可以使用位运算进行快速的数值计算和状态控制。 ### 枚举 枚举是一种常用的算思想,其基本思路是枚举所有可能的情况,然后从中找出符合条件的解。在Java中,可以使用枚举类型来实现枚举。 枚举类型是Java中的一种特殊类型,它允许我们将一组有限的常量放入一个枚举类型中。例如,我们可以定义一个表示星期几的枚举类型: ``` enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } ``` 在枚举类型中,每个常量都是一个枚举类型的实例,我们可以使用枚举类型的实例来代表一个特定的值。例如,我们可以使用Day.MONDAY来表示星期一。 使用枚举类型可以让代码更加清晰和可读,同时也方便进行类型安全的编程。在实现枚举时,我们通常会将枚举类型作为输入参数,然后枚举其中的所有可能情况,找出符合条件的解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值