hdu-5977 Garden of Eden(树分治)
题目链接:
Garden of Eden
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 210 Accepted Submission(s): 75
One day, Satan came to the garden. He changed into a snake and went to live in the tree of knowledge. When Eve came near the tree someday, the snake called her. He gave her an apple and persuaded her to eat it. Eve took a bite, and then she took the apple to Adam. And Adam ate it, too. Finally, they were driven out by God and began a hard journey of life.
The above is the story we are familiar with. But we imagine that Satan love knowledge more than doing bad things. In Garden of Eden, the tree of knowledge has n apples, and there are k varieties of apples on the tree. Satan wants to eat all kinds of apple to gets all kinds of knowledge.So he chooses a starting point in the tree,and starts walking along the edges of tree,and finally stops at a point in the tree(starting point and end point may be same).The same point can only be passed once.He wants to know how many different kinds of schemes he can choose to eat all kinds of apple. Two schemes are different when their starting points are different or ending points are different.
For each case, the first line contains two integers n and k, denoting the number of apples on the tree and number of kinds of apple on the tree respectively.
The second line contains n integers meaning the type of the i-th apple. Types are represented by integers between 1 and k .
Each of the following n-1 lines contains two integers u and v,meaning there is one edge between u and v.1≤n≤50000, 1≤k≤10
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- const int maxn=5e4+5;
- int n,k,fk,a[maxn],p[13];
- int siz[maxn],son[maxn],vis[maxn],root,MAX,cnt,num[1030],d[maxn],cn=0,head[maxn];
- LL ans=0;
- struct Edge
- {
- int to,next;
- }edge[2*maxn];
- inline void add_edge(int from,int to)
- {
- edge[cn].to=to;
- edge[cn].next=head[from];
- head[from]=cn++;
- }
- inline void init()
- {
- cn=0;
- fk=(1<<k)-1;
- ans=0;
- for(int i=0;i<=n;i++)vis[i]=0;
- memset(head,-1,sizeof(head));
- }
- void get_siz(int cur,int fa)
- {
- siz[cur]=1;
- son[cur]=0;
- for(int i=head[cur];i!=-1;i=edge[i].next)
- {
- int x=edge[i].to;
- if(x==fa||vis[x])continue;
- get_siz(x,cur);
- siz[cur]+=siz[x];
- if(siz[x]>son[cur])son[cur]=siz[x];
- }
- }
- void find_root(int cur,int fa,int rt)
- {
- if(siz[rt]-siz[cur]>son[cur])son[cur]=siz[rt]-siz[cur];
- if(son[cur]<MAX)MAX=son[cur],root=cur;
- for(int i=head[cur];i!=-1;i=edge[i].next)
- {
- int x=edge[i].to;
- if(x==fa||vis[x])continue;
- find_root(x,cur,rt);
- }
- }
- void get_state(int cur,int fa,int sta)
- {
- d[cnt++]=sta;
- num[sta]++;
- for(int i=head[cur];i!=-1;i=edge[i].next)
- {
- int x=edge[i].to;
- if(vis[x]||x==fa)continue;
- get_state(x,cur,a[x]|sta);
- }
- }
- LL cal(int cur,int sta)
- {
- cnt=0;
- memset(num,0,sizeof(num));
- get_state(cur,0,sta);
- for(int i=0;i<k;i++)
- {
- for(int j=fk;j>=0;j--)
- {
- if(!(p[i]&j))num[j]+=num[j|p[i]];
- }
- }
- LL ret=0;
- for(int i=0;i<cnt;i++)ret=ret+num[fk^d[i]];
- return ret;
- }
- void dfs(int cur)
- {
- MAX=n;
- get_siz(cur,0);
- find_root(cur,0,cur);
- int Root=root;
- ans=ans+cal(root,a[Root]);
- vis[root]=1;
- for(int j=head[Root];j!=-1;j=edge[j].next)
- {
- int x=edge[j].to;
- if(vis[x])continue;
- ans=ans-cal(x,(a[x]|a[Root]));
- dfs(x);
- }
- }
- int main()
- {
- p[0]=1;for(int i=1;i<=11;i++)p[i]=p[i-1]*2;
- while(scanf("%d%d",&n,&k)!=EOF)
- {
- init();
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&a[i]);
- a[i]=p[a[i]-1];
- }
- int u,v;
- for(int i=1;i<n;i++)
- {
- scanf("%d%d",&u,&v);
- add_edge(u,v);
- add_edge(v,u);
- }
- dfs(1);
- printf("%lld\n",ans);
- }
- return 0;
- }
hdu-5977 Garden of Eden(树分治)的更多相关文章
- HDU 5977 Garden of Eden (树分治+状态压缩)
题意:给一棵节点数为n,节点种类为k的无根树,问其中有多少种不同的简单路径,可以满足路径上经过所有k种类型的点? 析:对于路径,就是两类,第一种情况,就是跨过根结点,第二种是不跨过根结点,分别讨论就好 ...
- HDU 5977 Garden of Eden(点分治求点对路径颜色数为K)
Problem Description When God made the first man, he put him on a beautiful garden, the Garden of Ede ...
- hdu 5977 Garden of Eden(点分治+状压)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5977 题解:这题一看就知道是状压dp然后看了一下很像是点分治(有点明显)然后就是简单的点分治+状压dp ...
- HDU 5977 Garden of Eden
题解: 路径统计比较容易想到点分治和dp dp的话是f[i][j]表示以i为根,取了i,颜色数状态为j的方案数 但是转移这里如果暴力转移就是$(2^k)^2$了 于是用FWT优化集合或 另外http: ...
- HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)
CGZ大佬提醒我,我要是再不更博客可就连一月一更的频率也没有了... emmm,正好做了一道有点意思的题,就拿出来充数吧=.= 题意 一棵树,有 $ n (n\leq50000) $ 个节点,每个点都 ...
- HDU - 5977 Garden of Eden (树形dp+容斥)
题意:一棵树上有n(n<=50000)个结点,结点有k(k<=10)种颜色,问树上总共有多少条包含所有颜色的路径. 我最初的想法是树形状压dp,设dp[u][S]为以结点u为根的包含颜色集 ...
- HDU-5977 - Garden of Eden 点分治
HDU - 5977 题意: 给定一颗树,问树上有多少节点对,节点对间包括了所有K种苹果. 思路: 点分治,对于每个节点记录从根节点到这个节点包含的所有情况,类似状压,因为K<=10.然后处理每 ...
- HDU5977 Garden of Eden(树的点分治)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5977 Description When God made the first man, he ...
- HDU 4871 Shortest-path tree 最短路 + 树分治
题意: 输入一个带权的无向连通图 定义以顶点\(u\)为根的最短路生成树为: 树上任何点\(v\)到\(u\)的距离都是原图最短的,如果有多条最短路,取字典序最小的那条. 然后询问生成树上恰好包含\( ...
随机推荐
- HTML5填充颜色的fillStyle测试
效果:http://hovertree.com/texiao/html5/canvas/1/ 代码: <html> <head> <meta http-equiv=&qu ...
- java条件语句练习题
输入三个数字显示最大的: System.out.println("请输入三个数字:"); int a,b,c; Scanner d = new Scanner(System.in) ...
- 当shiro不进入自定义realm的权限认证方法时
需要加入下面的一个bean @Bean public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){ DefaultAdvisorA ...
- Codeforces Round #376A (div2)
Night at the Museum 题意: 有一个转盘,26个英文字母均匀分布在转盘边缘,转针初始位置在字母a,每次只能转动到相邻的字母,然后输入一个由26个字母组成的字符串(最长100),不复位 ...
- 今天再给大家带点html5前端开发的干货模板“text/tpl”怎么用 script template怎么用
text/tpl 顾名思义就是模板,其实和C++模板函数类似的作用,就是利用他生成一个HMTL内容,然后append或者替换html里面 有什么好处,假如后端返回来的数据都是一样的,但是需要生成不同的 ...
- arcgis for flex展示GIS基本功能
1.地图框选搜索: 这是空间查询,在地图上框选一定的范围,然后搜索出在这个范围之内的所有信息,搜索到的详细信息在列表框显示出来 2.属性查询: 3.数据库展示: 4.绘制图形: 地图上绘制各种不同形状 ...
- iOS之2016面试题一
序言 招聘高峰期来了,大家都非常积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,但是了解不够深.本篇文章为群里的小伙伴们去宝库公司的笔试题,由笔者整理并提供笔者个人参考答 ...
- Android项目实战(二十八):Zxing二维码实现及优化
前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的ja ...
- IOS开发基础知识--碎片28
1:通用的weakify和strongify /** * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 * 调用方式: `@weakify_self`实现弱引用转换,` ...
- CSS3-03 样式 2
前言 在上一篇的博客中,阐述了 CSS 盒模型中的 Margin.Border.Padding 三个样式.但是总觉得,这些东西好像是 HTML 元素的包装样式,真正的要点是 HTML 元素(即:盒模型 ...