链接:https://www.nowcoder.com/acm/contest/131/C
来源:牛客网

题目描述

有一棵树包含 N 个节点,节点编号从 1 到 N。节点总共有 K 种颜色,颜色编号从 1 到 K。第 i 个节点的颜色为 Ai
Fi 表示恰好包含 i 种颜色的路径数量。请计算:

输入描述:

第一行输入两个正整数 N 和 K,N 表示节点个数,K 表示颜色种类数量。
第二行输入 N 个正整数,A1, A2, A3, ... ..., AN,Ai 表示第 i 个节点的颜色。
接下来 N - 1 行,第 i 行输入两个正整数 Ui 和 Vi,表示节点 Ui 和节点 Vi 之间存在一条无向边,数据保证这 N-1 条边连通了 N 个节点。
1 ≤ N ≤ 50000. 1 ≤ K ≤ 10. 1 ≤ Ai ≤ K.

输出描述:

输出一个整数表示答案。

因为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. 多彩的树(状压+容斥)相关推荐

  1. 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) ...

  2. 【状压+容斥】BZOJ4455 [ZJOI2016] 小星星

    [题目] lydsy 一幅nnn个点的树和一棵nnn个点的树,问有多少种点对应方式使得树上存在一条边则图上也存在一条边. n≤17n\leq 17n≤17 [解题思路] 直接求一一对应并不好算,我们可 ...

  3. 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​ ...

  4. Wannafly挑战赛19

    Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...

  5. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  6. bzoj 4006 管道连接 —— 斯坦纳树+状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...

  7. HDU - 7009 树上游走(树的直径+容斥)

    题目链接:点击查看 题目大意:给一棵树,称一个点集 S 是好的当且仅当存在一个点,其到 S 中所有点的距离互不相同,求 |S| 的最大值和使得 |S| 最大的 S 的个数 题目分析:不难看出 ∣S∣| ...

  8. 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)

    题干: Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist ...

  9. 【YBT2022寒假Day3 C】毒瘤染色(LCT)(圆方树)(容斥)

    毒瘤染色 题目链接:YBT2022寒假Day3 C 题目大意 要你在线实现一个操作: 一开始有 n 个点,没有边,然后操作会给你一条边. 如果保证加了之后这个图还是沙漠就加上. 然后每次加完边之后问你 ...

最新文章

  1. [Share]2008年国外最佳Web设计/开发技巧、脚本及资源总结
  2. 取消大小周的第一个周末,我吃了顿烤串
  3. python中map函数的用法
  4. 保持生长不焦虑,非科班程序媛的进击
  5. 如何用代码对repeating section控件新增Item(InfoPath)
  6. CentOS 7 设置IP地址无效
  7. webpack3.0 压缩css 但是不在html中引用,webpack怎样压缩css?
  8. Kudu :Service unavailable: Soft memory limit exceeded at xxx% of capacity
  9. QTP自动例子的源码分析--ClearMainWindow
  10. 三维建模软件:Rhino 7 for Mac
  11. 超强阵容实操教学, 0 基础 Flink 训练营免费抢报啦!
  12. Android移动开发基础案例教程 第2章 Android UI开发
  13. C盘清理工具Dism++教程
  14. win7下安装最新版nodejs16.4.0
  15. 为什么打印机打印照片模糊_家用喷墨打印机打印照片不清楚怎么办 是什么原因?...
  16. 小武实习的debug日记2
  17. 第六章 姜小白当机立断逃莒国 姜诸儿瓜期不代终遇鬼
  18. 利用Python实现模糊查找
  19. 使用swiper组件的transform属性导致文字模糊的解决办法
  20. 程序员毕业3年 如何 面试互联网高级开发(附简历模板)

热门文章

  1. python爬虫代码-Python爬虫大小项目集合
  2. python发音-Python如何实现文本转语音
  3. 怎么实现语音识别_手机语音识别怎么设置
  4. 技能高考多少分上本科计算机,技能高考多少分上一本
  5. LeetCode 516 最长回文子串
  6. 【数据结构和算法笔记】图的相关概念(有向图,无向图......)
  7. [总结]RTMP流媒体技术零基础学习方法
  8. 最简单的基于FFmpeg的移动端例子:IOS 视频转码器
  9. MFC窗口支持文件拖入
  10. plsql导入数据主键_使用plsql添加数据并自动生成主键