Wannafly挑战赛19:C. 多彩的树(状压+容斥)
链接:https://www.nowcoder.com/acm/contest/131/C
来源:牛客网
题目描述
Fi 表示恰好包含 i 种颜色的路径数量。请计算:
输入描述:
第一行输入两个正整数 N 和 K,N 表示节点个数,K 表示颜色种类数量。 第二行输入 N 个正整数,A1, A2, A3, ... ..., AN,Ai 表示第 i 个节点的颜色。
输出描述:
输出一个整数表示答案。
因为k只有10,所以可以暴力所有2^k种情况,对于每一种情况计算有多少种不同的路径
设dp[x]表示x状态下路径的条数,例如假设k=5,x=10010(二进制),那么dp[x]就相当在保留所有颜色为2,5的节点,删除所有其它颜色节点的情况下路径的条数
不过因为dp[x]并不是经过当前所有保留颜色的路径条数,所以还要容斥一下,直接2^20暴力即可,奇加偶减,这样就可以求出总共经过i种不同颜色的路径条数了
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define LL long long
#define mod 1000000007
int col[50005], p[55], vis[50005];
LL sum, ans[15], cds[15] = {1}, dp[1111], num[1111], dp2[1111];
vector<int> G[50005];
void Sech(int x)
{int i, v;vis[x] = 1, sum++;for(i=0;i<G[x].size();i++){v = G[x][i];if(vis[v] || p[col[v]]==0)continue;Sech(v);}
}
int main(void)
{LL cot;int n, k, i, j, x, y;scanf("%d%d", &n, &k);for(i=1;i<=k;i++)cds[i] = cds[i-1]*131%mod;for(i=1;i<=n;i++)scanf("%d", &col[i]);for(i=1;i<=n-1;i++){scanf("%d%d", &x, &y);G[x].push_back(y);G[y].push_back(x);}for(i=1;i<(1<<k);i++){x = 0;for(j=0;j<=k-1;j++){p[j+1] = 0;if(i&(1<<j))p[j+1] = 1, x++;}for(j=1;j<=n;j++)vis[j] = 0;for(j=1;j<=n;j++){if(vis[j]==0 && p[col[j]]){sum = 0;Sech(j);dp2[i] = dp[i] = (dp[i]+sum*(sum-1)/2)%mod;num[i] = x;}}}for(i=1;i<(1<<k);i++){for(j=1;j<(1<<k);j++){if((i|j)==i && i!=j){if((num[i]-num[j])%2)dp2[i] = (dp2[i]-dp[j]+mod)%mod;elsedp2[i] = (dp2[i]+dp[j])%mod;}}ans[num[i]] = (ans[num[i]]+dp2[i])%mod;}cot = 0;for(i=1;i<=k;i++)cot = (cot+ans[i]*cds[i])%mod;cot = (cot+n*131)%mod;printf("%lld\n", cot);return 0;
}
Wannafly挑战赛19:C. 多彩的树(状压+容斥)相关推荐
- bzoj4361 isn (dp+树状数组+容斥)
我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn) ...
- 【状压+容斥】BZOJ4455 [ZJOI2016] 小星星
[题目] lydsy 一幅nnn个点的树和一棵nnn个点的树,问有多少种点对应方式使得树上存在一条边则图上也存在一条边. n≤17n\leq 17n≤17 [解题思路] 直接求一一对应并不好算,我们可 ...
- jzoj6342-[NOIP2019模拟2019.9.7]Tiny Counting【树状数组,容斥】
正题 题目大意 一个序列SSS,求有多少个互不相同的4元组(a,b,c,d)(a,b,c,d)(a,b,c,d)使得a<b且Sa<Sba<b且S_a<S_ba<b且Sa ...
- Wannafly挑战赛19
Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...
- bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...
- bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
- HDU - 7009 树上游走(树的直径+容斥)
题目链接:点击查看 题目大意:给一棵树,称一个点集 S 是好的当且仅当存在一个点,其到 S 中所有点的距离互不相同,求 |S| 的最大值和使得 |S| 最大的 S 的个数 题目分析:不难看出 ∣S∣| ...
- 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)
题干: Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist ...
- 【YBT2022寒假Day3 C】毒瘤染色(LCT)(圆方树)(容斥)
毒瘤染色 题目链接:YBT2022寒假Day3 C 题目大意 要你在线实现一个操作: 一开始有 n 个点,没有边,然后操作会给你一条边. 如果保证加了之后这个图还是沙漠就加上. 然后每次加完边之后问你 ...
最新文章
- [Share]2008年国外最佳Web设计/开发技巧、脚本及资源总结
- 取消大小周的第一个周末,我吃了顿烤串
- python中map函数的用法
- 保持生长不焦虑,非科班程序媛的进击
- 如何用代码对repeating section控件新增Item(InfoPath)
- CentOS 7 设置IP地址无效
- webpack3.0 压缩css 但是不在html中引用,webpack怎样压缩css?
- Kudu :Service unavailable: Soft memory limit exceeded at xxx% of capacity
- QTP自动例子的源码分析--ClearMainWindow
- 三维建模软件:Rhino 7 for Mac
- 超强阵容实操教学, 0 基础 Flink 训练营免费抢报啦!
- Android移动开发基础案例教程 第2章 Android UI开发
- C盘清理工具Dism++教程
- win7下安装最新版nodejs16.4.0
- 为什么打印机打印照片模糊_家用喷墨打印机打印照片不清楚怎么办 是什么原因?...
- 小武实习的debug日记2
- 第六章 姜小白当机立断逃莒国 姜诸儿瓜期不代终遇鬼
- 利用Python实现模糊查找
- 使用swiper组件的transform属性导致文字模糊的解决办法
- 程序员毕业3年 如何 面试互联网高级开发(附简历模板)
热门文章
- python爬虫代码-Python爬虫大小项目集合
- python发音-Python如何实现文本转语音
- 怎么实现语音识别_手机语音识别怎么设置
- 技能高考多少分上本科计算机,技能高考多少分上一本
- LeetCode 516 最长回文子串
- 【数据结构和算法笔记】图的相关概念(有向图,无向图......)
- [总结]RTMP流媒体技术零基础学习方法
- 最简单的基于FFmpeg的移动端例子:IOS 视频转码器
- MFC窗口支持文件拖入
- plsql导入数据主键_使用plsql添加数据并自动生成主键