博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 6035 树分治
阅读量:5113 次
发布时间:2019-06-13

本文共 1110 字,大约阅读时间需要 3 分钟。

题意:

一棵树,路径的权值等于路径上颜色的种类,问全部路径的价值和

 

思路:

题解的方法就不多讲了,这里提供一个树分治做法,首先要将原问题转换为每种颜色的经过路径数量的总和(也就是计算每种颜色的贡献,贡献为经过这种颜色的路径数量)

 

树分治的做法则为,维护重心下的子树第一次出现某种颜色的位置,通过这个位置已经这个点下面的子树大小,和一个相同颜色所有第一次出现的子树大小和来计算(注意去重),时间2s+通过,比较莽。。。毕竟比题解多个logn。。

 

代码:

 

#include
using namespace std;#define MEM(a,b) memset(a,b,sizeof(a))#define PB push_backtypedef long long ll;const int maxn =1e6+10;ll n,k,ans;int root,Max;struct node{ int v,next;}edge[maxn*2];int head[maxn],tot;int si[maxn],maxv[maxn],vis[maxn];int c[maxn],used[maxn],col[maxn],tmp[maxn];ll sum,allson;vector
us1,us2,su;void init(){ tot=ans=0;MEM(head,-1);MEM(vis,0);MEM(used,0);}void add_edge(int u,int v){ edge[tot].v=v;edge[tot].next=head[u];head[u]=tot++;}void dfssi(int u,int f){ si[u]=1;maxv[u]=0; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(v==f||vis[v])continue; dfssi(v,u); si[u]+=si[v]; if(si[v]>maxv[u])maxv[u]=si[v]; }}void dfsroot(int r,int u,int f){ if(si[r]-si[u]>maxv[u]) maxv[u]=si[r]-si[u]; if(maxv[u]

转载于:https://www.cnblogs.com/zhangxianlong/p/10672513.html

你可能感兴趣的文章
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
(转)Android之发送短信的两种方式
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>