Description

思源湖畔有一棵树,那是独孤玉溪最喜欢的地方。
传说中,这棵不见边际的树有N个节点,每个节点都有1片叶子,每片叶子都拥有K种颜色中的一种,独孤玉溪喜欢爬到这棵树上,沿着一条路线摘叶子,并拥有所有颜色的叶子。
独孤玉溪会选择一个起点,并沿着树边走,然后最终停在一个终点上(起点和终点可能相同),当然了每一个结点只能经过一次(每一片叶子只能摘一遍)。独孤玉溪突生奇想,有多少种不同的方案能满足自己呢?(两种方案不同当且仅当起点不同或终点不同)。

Input

第一行包含两个整数N和K。
第二行包含N个整数表示col[i],为每片叶子的颜色(col[i]为1到K的一个整数)。
第三行到第N+1行,每行有两个整数x、y,表示x与y之间有一条树边。

Output

一行,表示求得的答案。

Sample Input

3 2
1 2 2
1 2
1 3

Sample Output

6

Data Constraint

20%的数据:N<=10000,K<=10
40%的数据:N<=50000,K<=2
100%的数据:N<=50000,K<=10

Solution

  • 如果去掉颜色的限制,那么对于一棵N个节点的树,

  • 毫无疑问,它的路径个数就是 N2N^2 了。

  • 现在有了颜色的限制,直接算不好算,但是K不大,可以考虑容斥。

  • 枚举哪些颜色不被选,剩下其它颜色可以选或不选。然后把这些颜色对应的点全部删去,

  • 这样得到一个森林,接下来 O(N)O(N) 统计答案,最后乘上容斥系数即可。

  • 只要会容斥原理,这种方法是没什么理解难度的。

Code

#include<cstdio>
#include<cstring>
using namespace std;
const int N=50001;
int n,k,tot;
long long ans,sum;
int a[N],p[11];
int first[N],next[N*2],en[N*2];
bool bz[N];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline void find(int x,int s)
{bz[x]=true;sum++;for(int i=first[x];i;i=next[i])if(!bz[en[i]] && !(s&p[a[en[i]]-1])) find(en[i],s);
}
inline void dfs(int x,int f,int s)
{if(x==k){memset(bz,false,sizeof(bz));for(int i=1;i<=n;i++)if(!bz[i] && !(s&p[a[i]-1])){sum=0;find(i,s);ans+=f*sum*sum;}return;}dfs(x+1,f,s);dfs(x+1,-f,s+p[x]);
}
int main()
{n=read(),k=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=p[0]=1;i<=k;i++) p[i]=p[i-1]*2;for(int i=1;i<n;i++){int x=read(),y=read();insert(x,y);insert(y,x);}dfs(0,1,0);printf("%lld",ans);return 0;
}

JZOJ 5050. 【GDOI2017模拟一试4.11】颜色树相关推荐

  1. JZOJ 5048. 【GDOI2017模拟一试4.11】IQ测试

    Description PTY进行IQ测试,测试的项目是判断一个序列是否是另外一个序列删除若干个数字之后得 到的,PTY 深知自己的IQ 低于sqrt(-1),所以他请来了智商超高的你来替他解决问题. ...

  2. BZOJ 5049. 【GDOI2017模拟一试4.11】腐女的生日

    Description 腐女要过生日了,pty 想给腐女送礼物,但是腐女所在的教室离pty 的教室太远了,于是pty就拜托会动归和A星的djy帮忙送礼物.djy在学校建立了一个平面直角坐标系,他站在了 ...

  3. 【jzoj5055】【GDOI2017模拟二试4.12】【树上路径】【点分治】

    题目大意 给定一颗n个结点的无根树,树上的每个点有一个非负整数点权,定义一条路径的价值为路径上的点权和-路径的点权最大值. 给定参数p,我们想知道,有多少不同的树上简单路径,满足它的价值恰好是p的倍数 ...

  4. 《金蝶ERP—K/3标准财务模拟实训(11.X版)》——第1章 金蝶K/3标准财务介绍 1.1 金蝶K/3标准财务系统介绍...

    本节书摘来自异步社区<金蝶ERP-K/3标准财务模拟实训(11.X版)>一书中的第1章,第1.1节,作者 龚中华,何亮,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  5. 梦幻模拟战手游服务器维护,梦幻模拟战手游11月21日更新公告 执行者降临限时召唤开启[多图]...

    梦幻模拟战手游11月21日更新内容中开启了限时十连抽必得SR英雄哦,同时还有时空的轨迹SC秘境新挑战,接下来跟随安族大大来看看详细资讯详情吧,希望各位能够喜欢~ 梦幻模拟战手游11月21日更新公告 服 ...

  6. 今天收到模拟飞行平台X-Plane 11官方邮件

    今天收到模拟飞行平台X-Plane 11官方邮件.主要是X-Plane 11.50版本正在经历一个长长的公测阶段,今天的版本是X-Plane 11.50b14,他们把API变成了thread unsa ...

  7. 11.3 树的遍历:LDR,LRD,VLR 相关代码

    11.3 树的遍历:LDR,LRD,VLR 相关代码 基础定义介绍见这里 VLR:前序遍历 LDR:中序遍历 LRD:后序遍历 <?phpclass Leaf{public $leftLeaf; ...

  8. 【GDOI2017模拟11.7】太阳神

    题目描述 太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目. 求满足如下条件的数对(a,b)对数:a,b均为正整数且a,b<=n而lcm(a,b)>n.其中的lcm当然表示 ...

  9. jzoj4684. 【GDOI2017模拟8.11】卡牌游戏

    原来想这道题时田忌赛马问题...从贪心想...一直没想出来...naive 事实上,这道题其实就是田忌赛马问题,但是有添加操作,所以单纯排序不行了 注意到d同学的贪心策略也可以表示为如下:(默认规则为 ...

最新文章

  1. linux用户及权限
  2. 基于libvlc和wxWidgets的简单播放器代码阅读
  3. 数据结构之快速排序图文详解及代码(C++实现)
  4. 医学科研如何快速掌握R语言?
  5. 【论文解读】ICDM2020 | 挖掘异构图中的层级结构
  6. linux显示内存状态,Linux显示内存状态
  7. as真机调试_如何使用真机调试android程序
  8. Linux 系统中 Redis 的安装及其使用
  9. qt中append函数_Qt 加载cern-root库 并调用root类
  10. JavaScript开发工具--Aptana
  11. android 开发工具类,Android中常用开发工具类—持续更新...
  12. 2022年电工杯B题参赛历程
  13. 使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类(二)
  14. Maple拥有优秀的符号计算和数值计算能力
  15. C语言中EOF什么意思
  16. 微信公众号小白的进阶之路
  17. 2019一键清空朋友圈_新整理再见2019你好2020朋友圈励志说说
  18. 如何做好一个让领导欣赏的下属
  19. Lightweight Augmented Graph Network Hashing for Scalable Image Retrieval
  20. 数据采集和用户留存分析

热门文章

  1. 用pytorch加载训练模型
  2. 【算法】SVM分类精度为0,结果很烂怎么办?
  3. [云炬创业学笔记]第一章创业是什么测试15
  4. [云炬看世界]个人站长
  5. 云炬Android开发笔记 3-2字体图标库集成与封装
  6. 打羽毛球如何提高手腕的爆发力
  7. 杂项题的基本解题思路——1、文件操作与隐写
  8. 网页转 markdown 的工具
  9. 更灵活的定位内存地址的方法---汇编学习笔记
  10. protobuf扫盲