[Codeforces 724G. Xor-matic Number of the Graph]线性基+计数

news/2024/11/8 15:04:07/

[Codeforces 724G. Xor-matic Number of the Graph]线性基+计数

分类:Data Structure bitmasks math

1. 题目链接

[Codeforces 724G. Xor-matic Number of the Graph]

2. 题意描述

一个边权非负整数的无向连通图,节点编号为 1 ~n,三元组 <u,v,s> 表示从 u v的路径的异或和为 s (可以多次经过同一个顶点或同一条边),求出所有这样的三元组<u,v,s>中关于 s 的和。
数据范围1n10000,0m200000,01018

3. 解题思路

假设这个无向图是一棵树,那么可以通过对每个二进制位单独算贡献。统计出树上的边中,每一位出现的次数,令 ajbj 分别表示第 j 位在树上出现了aj 0 bj 1 ,那么答案就是 log2(1018)j=0(ajbj2j)
现在考虑这个无向图是一个联通图,那么就可能存在一些环。做法同《[BZOJ 2115 Wc2011 Xor]线性基》,求出所有环的异或值,然后求一次线性基。设线性基的 r 。那么,按位统计答案的时候应该这样做:

  1. 如果线性基中的第j位全为0,那么贡献就是 log2(1018)j=0(ajbj2j2r) ,即线性基的任意组合都是可以的。

    • 反之,那么贡献就是 log2(1018)j=0(ajbj2j2r1+aj(aj1)22r1+bj(bj1)22r1) ,即根据选的两个点的路径上的异或值为0还是为1,决定线性基的该位选还是不选。
    • 感觉这道题目学到了很多姿势!

      4. 实现代码

      #include <bits/stdc++.h>
      using namespace std;typedef long long ll;
      typedef unsigned long long ull;
      typedef pair<int, int> pii;const int inf = 0x3f3f3f3f;
      const ull infl = 0x3f3f3f3f3f3f3f3fLL;
      template<typename T> inline void umax(T &a, T b) { a = max(a, b); }
      template<typename T> inline void umin(T &a, T b) { a = min(a, b); }const int MAXN = 100005;
      const ull MOD = 1e9 + 7;typedef pair<int, ull> Edge;
      vector<Edge> G[MAXN];
      int n, m;
      vector<ull> xorv;
      ull xpath[MAXN], base[100], qz[200];
      bool used[MAXN];
      int cnt[100][2];void dfs(int u, int fa) {int v; ull w;used[u] = true;for (int i = 0; i < G[u].size(); ++i) {tie(v, w) = G[u][i];if (v == fa) continue;if (used[v]) {xorv.push_back(xpath[v] ^ xpath[u] ^ w);} else {xpath[v] = xpath[u] ^ w;dfs(v, u);}}for (int j = 0; j <= 62; ++j) {++ cnt[j][xpath[u] >> j & 1];}
      }int Guass_base() {int rank = 0;for (int i = 0; i <= 62; ++i) base[i] = 0;for (int i = 0; i < xorv.size(); ++i) {for (int j = 62; j >= 0; --j) {if (!(xorv[i] >> j & 1)) continue;if (!base[j]) {base[j] = xorv[i];++ rank;break;}xorv[i] ^= base[j];}}return rank;
      }int main() {
      #ifdef ___LOCAL_WONZY___freopen("input.txt", "r", stdin);
      #endif // ___LOCAL_WONZY___int u, v; ull w;qz[0] = 1;for (int i = 1; i < 200; ++i) qz[i] = qz[i - 1] * 2 % MOD;while (~scanf("%d %d", &n, &m)) {for (int i = 1; i <= n; ++i) {G[i].clear();used[i] = false;}for (int i = 1; i <= m; ++i) {scanf("%d %d %llu", &u, &v, &w);G[u].push_back(Edge(v, w));G[v].push_back(Edge(u, w));}ull ans = 0;for (int i = 1; i <= n; ++i) {if (used[i]) continue;xorv.clear();memset(cnt, 0, sizeof(cnt));dfs(i, 0);sort(xorv.begin(), xorv.end());xorv.erase(unique(xorv.begin(), xorv.end()), xorv.end());reverse(xorv.begin(), xorv.end());int rank = Guass_base();for (int j = 0; j <= 62; ++j) {bool sign = false;for (int k = 0; k <= 62; ++k) sign |= (base[k] >> j & 1);if (!sign) {ull temp = (ull)cnt[j][0] * cnt[j][1];ans = (ans + temp % MOD * qz[j + rank]) % MOD;} else {ull temp = (ull)cnt[j][0] * cnt[j][1];temp += (ull)cnt[j][0] * (cnt[j][0] - 1) / 2;temp += (ull)cnt[j][1] * (cnt[j][1] - 1) / 2;ans = (ans + temp % MOD * qz[j + rank - 1]) % MOD;}}}printf("%llu\n", ans);}
      #ifdef ___LOCAL_WONZY___cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << "ms." << endl;
      #endif // ___LOCAL_WONZY___return 0;
      }

http://www.ppmy.cn/news/648366.html

相关文章

yolo 实例分割

dataload: 输出多了一个掩码(masks) return (torch.from_numpy(img), labels_out, self.im_files[index], shapes, masks) 掩码是什么&#xff1f; 分割是预测的什么&#xff1f; def polygon2mask(img_size, polygons, color1, downsample_ratio1):"""Args…

nginx: [warn] the number of “worker_processes“ is not equal to the number of “worker_cpu_affinity“ m

报错nginx: [warn] the number of “worker_processes” is not equal to the number of “worker_cpu_affinity” masks, using last mask for remaining worker processes 解决&#xff1a; 优化cpu核数 ls cpu 查看cpu核数 按图片的配置文件修改

OpenCV DNN模块教程(四)Mask-RCNN实例分割

本文为OpenCV DNN模块官方教程的扩展&#xff0c;介绍如何使用OpenCV加载TensorFlow Object Detection API训练的模型做实例分割&#xff0c;以Mask-RCNN为例来检测缺陷。TensorFlow Object Detection API的github链接地址如下&#xff1a;https://github.com/tensorflow/model…

基于ChatGLM2和langchain的本地知识库问答的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Spring 的依赖注入(DI)

前言 欢迎来到本篇文章&#xff0c;书接上回&#xff0c;本篇说说 Spring 中的依赖注入&#xff0c;包括注入的方式&#xff0c;写法&#xff0c;该选择哪个注入方式以及可能出现的循环依赖问题等内容。 如果正在阅读的朋友还不清楚什么是「依赖」&#xff0c;建议先看看我第一…

一张SSL证书支持绑定多个域名吗?

一张SSL证书可支持绑定多个不同类型的域名&#xff0c;选择多域名SSL证书&#xff08;SAN SSL&#xff09;或通配符SSL证书&#xff08;Wildcard SSL&#xff09;类型&#xff0c;就可以实现一张SSL证书绑定多个域名&#xff0c;但绑定的域名类型有些不同。 1、多域名SSL证书&a…

如何查看k8s中kube-proxy的模式是ipvs还是iptables

要查看 Kubernetes 中 kube-proxy 的模式&#xff08;IPVS 还是 iptables&#xff09;&#xff0c;可以使用以下方法之一&#xff1a; 1. 通过 kubectl 命令查看 kube-proxy 的配置&#xff1a; kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode这将显示…

win7旗舰版64位安装SQL2000无响应

1、确保计算机名称为大写字母&#xff0c;暂时关闭各类防护软件 2、确定SQL安装包在英文目录下 3、安装目录下的SETUP文件右键&#xff0c;属性设置兼容性 4、注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下增加SafeDllSearchMode键&…