当前位置: 首页 > news >正文

MC0309魔法项链

思路:

以数位贡献的思路来写这题,

  • 统计每一位上为 1 的个数

    • 对于第 k 位,统计有多少个数在这一位上为 1,记作 cnts[k]

  • 枚举每个数,逐位分析它对整体的贡献(即与其它数交互时的和)

    • 如果第 k 位为 1:

      • & 中只有其他第 k 位为 1 的数才会产生贡献:共 cnts[k] - 1

      • | 中其他所有 n - 1 个数都可以贡献

      • 总和为:

        (1≪k)×((n−1)+(cnts[k]−1))
    • 如果第 k 位为 0:

      • & 无贡献

      • | 仅与第 k 位为 1 的数有贡献(共 cnts[k] 个)

      • 总和为:

        (1≪k)×cnts[k]
  • 总贡献除以 2,避免重复计算每对 (i,j)

  • 最后加上所有数本身的魔力值。

(数位贡献)

时间复杂度:O(n)

代码:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;int main() {int n;cin >> n;vector<ll> a(n);vector<ll> cnts(30, 0);for (int i = 0; i < n; ++i) {cin >> a[i];for (int k = 0; k < 30; ++k) {if ((a[i] >> k) & 1) cnts[k]++;}}ll ans = 0;for (int i = 0; i < n; ++i) {for (int k = 0; k < 30; ++k) {if ((a[i] >> k) & 1) {ans += (1LL << k) * ((n - 1) + (cnts[k] - 1));} else {ans += (1LL << k) * cnts[k];}}}ans /= 2;  // 每对重复计算了两次for (ll val : a) ans += val;cout << ans << endl;return 0;
}

相关文章:

  • 从微积分到集合论(1630-1910)(历史简介)——第3章——数学分析的出现及其基础性进展(1780-1880)(I.Grattan-Guinness)
  • 65常用控件_QListWidget的使用
  • C++ 判断文件的编码类型
  • 如何选择适合团队的项目管理工具
  • 【AI News | 20250529】每日AI进展
  • 人工智能-训练AI模型涉及多个步骤
  • 从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用
  • NC52 有效括号序列【牛客网】
  • [9-2] USART串口外设 江协科技学习笔记(9个知识点)
  • 每日算法-250529
  • 车载摄像头选型相关
  • 自定义异常小练习
  • QSS 使用方式介绍
  • cf2067A
  • 一个开源脚本,可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内容
  • 大数据治理体系构建与实践路径
  • 文科小白学习Linux系统之安全管理
  • Debian:自由操作系统的精神图腾与技术基石
  • 12:遨博机器人开发
  • K6 是什么
  • 网站后台怎么更新网站/天津seo优化排名
  • 外贸工厂 网站建设/百度快照优化seo
  • 网站开发对显卡的要求/百度联盟点击广告赚钱
  • 网站ico设计/搜索营销
  • 成都交投成高建设公司网站/搜索引擎优化 简历
  • wordpress首页缩略图/网络优化软件有哪些