[COCI2021-2022#4] Šarenlist

news/2024/11/28 7:41:38/文章来源:https://www.cnblogs.com/YzaCsp/p/18573431

算法

首先, 合法路径上至少有两条边颜色不同, 我们考虑正难则反, 统计不合法的数量, 那么合法数量就等于总可能数 \(-\) 不可能数

中间转化的部分在这里写没有什么意义, 跳转至 Luogu 题解区

那么我们的问题转化成, 如何计算多条路径中, 某些路径不合法的情况数

首先我们需要考虑, 对于每条路径, 我们考虑将其缩成一个点, 方便计算, 因为只要选择了这一个点的颜色, 其他的都确定了 (这里是不合法情况)

这个我们用并查集处理, 在找每条路径时, 记录一下即可

在枚举第 \(i\) 条路径颜色相同并累加上对应情况数时,我们使其它边颜色任选,就会出现其它指定的路径颜色也相同的情况,也就是说,在计算第 \(i\) 种情况时,也会算上一部分 \(j\) 的情况( \(W_i\)\(W_j\) 有交集),或者说,\(W_i\) 实际上是 至少\(i\) 条路径颜色相同的情况

关于如何处理路径不合法的方案数重复计算这一问题, 我们考虑使用容斥原理

使用状压的 \(\rm{trick}\)

代码

#include <bits/stdc++.h>#define int long long
const int MOD = 1e9 + 7;
const int MAXN = 65;int n, m, k;int kpow[MAXN];
int Ans = 0;std::map<std::pair<int, int>, int> mp;
std::vector<int> e[MAXN], Past[MAXN];struct DSU_struct
{int fa[MAXN];int getfa(int x) { return fa[x] == x ? x : fa[x] = getfa(fa[x]); }void fa_init() { for (int i = 1; i <= n; i++) fa[i] = i; }
} DSU;bool dfs(int Now, int to, int fa, int num)
{if (Now == to)return true;for (auto i : e[Now]){if (i == fa)continue;if (dfs(i, to, Now, num)){Past[num].push_back(mp[{Now, i}]);return true;}}return false;
}int calc(int x)
{DSU.fa_init();int cnt = 0;for (int i = 1; i <= m; i++)if (x & (1 << (i - 1)))for (auto j : Past[i])DSU.fa[DSU.getfa(j)] = DSU.getfa(Past[i][0]);for (int i = 1; i <= n - 1; i++)cnt += (DSU.fa[i] == i);return cnt;
}void init() {kpow[0] = 1;for (int i = 1; i <= n; i++)kpow[i] = kpow[i - 1] * k % MOD;
}signed main()
{scanf("%lld %lld %lld", &n, &m, &k);init();for (int i = 1; i <= n - 1; i++) {int u, v;scanf("%lld %lld", &u, &v);mp[{u, v}] = mp[{v, u}] = i;e[u].push_back(v);e[v].push_back(u);}/*计算简单路径长度*/for (int i = 1; i <= m; i++) {int u, v;scanf("%d %d", &u, &v);dfs(u, v, u, i);}for (int i = 0; i < (1 << m); i++) {Ans += ((__builtin_popcount(i) & 1) ? -1 : 1) * kpow[calc(i)] + MOD;Ans %= MOD;}printf("%lld", Ans);
}

总结

正难则反

善于转化问题, 善于利用数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842685.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读数据质量管理:数据可靠性与数据质量问题解决之道17数据网格

数据网格1. 要点 1.1. 实现数据质量不能纸上谈兵,而获得“可靠数据”取决于数据分析和工程实践中的其他几个要素 1.2. 数据网格以及数据质量适用的地方 1.3. 数据质量在基于云的数据栈旅程中的作用 1.4. 知识图谱是更易于访问数据的关键 1.5. 分布式数据架构下的数据发现 1.6.…

Python迷你HTML渲染框架(by GPT)

# 文件名: html.pydef html_tag(tag_name):"""创建通用 HTML 标签函数"""def tag_func(*content, **attrs):# 处理属性attr_str = " ".join(f{key}="{value}" if value is not None else keyfor key, value in attrs.items(…

bios里面有多个引导项,删除多余的启动项

现在是2024年11月28日,星期四. 比如我的笔记本是win10系统,在bios界面有多个引导项,很多都没有用了,我想要删除其中多余的启动项, 我有2个Windows Boot Manager, 2个Linpus lite, 1个ubuntu, 我以前安装过一个deepin和windows双系统,然后又重装过windows系统,不知道为啥会出现出…

深入云电脑PC Farm技术探讨,以阿里云、华为云、ToDesk为例

🌝引言 近年来,云计算技术的飞速发展为各行各业的数字化转型带来了全新机遇,其中云电脑作为一种虚拟化桌面解决方案,逐渐成为个人用户与企业的核心选择。从远程办公、在线教育到高性能计算需求,云电脑通过为用户提供随时随地的访问能力、高效的计算资源分配以及低成本的硬…

搜索树与图

目录Dfs模板原理代码实现Bfs模板原理代码实现邻接表拓扑序列原理突破代码实现最短路问题Dijkstra代码实现bellman_ford算法bellamn_ford代码实现spfas算法代码实现判断负环floid算法代码实现最小生成树问题Prim算法代码思路代码实现 Dfs模板原理 dfs原名叫做深度优先遍历,以上…

开源 - Ideal库 - Excel帮助类,设计思路(一)

封装Excel常用操作,围绕导入导出设计,通过DataTable实现对象集合与Excel转换,分为对象集合与DataTable转换、DataTable与Excel转换两部分,最终整合为对象集合与Excel转换方法。今天开始和大家分享关于Excel最长常用操作封装。01、起因 市面上有很多Excel操作库,这些库设计…

C++动态库详解

dmjcb个人博客 原文地址动态库 概念 动态库($Dynamic$ $Library$), 又称动态链接库($Dynamic$ $Link$ $Library$, $DLL$), 是一种在程序运行时所加载文件 其与静态库主要区别在于动态库代码并不在程序编译时直接包含, 而是在程序执行时根据需要动态加载 格式 graph LR;X(格式)X…

数分笔记

符号说明(部分) 存在唯一:\(\exist|\) 或 \(\exist!\) 使得:\(\operatorname{s.t.}\)(so that/such that) 非:\(\neg\) 正整数:\(\mathbb{Z}^+,\mathbb{N}_+,\mathbb{Z}_+,\mathbb{N}^+\) 定义为:\(\triangleq\) 或 \(\dot=\) 笛卡尔乘积 \(A\times B=\{(a,b)|a\in A,…

自用软件推荐、 思源笔记插件 | 记录

效率软件mykeyMap,可以设置键盘快捷键,提高码字效率。小键盘福音。 ​​自用习惯:(超级键Caps组合) 可以设置快捷启动软件 可以快速切换窗口,管理窗口。 可以快速调节音量 可以划词直接搜索其他网站内容(还挺好用的,平时搜索素材不用一个一个地打开网站再复制进去搜索)…

从零开始学 Maven:简化 Java 项目的构建与管理

Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。一、关于Maven 1.1 简介 Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。M…

左侧导航栏element -2024/11/27

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>首页</title><style>.demo-table-expand {font-size: 0;}.demo-table-expand label {width: 90px;color: #99a9bf;}.demo-table-expand …

考研打卡(28)

开局(28) 开始时间 2024-11-27 22:50:07 结束时间 2024-11-27 23:25:29明天是1124刚才和室友去吃了一百一的羊肉火锅数据结构 设哈希表长m=14,哈希函数H(key)=key MOD 11。 表中已有4个节点addr(15)=4,addr(38)=5,addr(61)=6,addr(84)=7, 其余地址为空,如用二次探查再散…