题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5293

被这题打蹦了,看着题解写的,很是爆炸,确实想不到,我用的DFS序+LCA+树形DP,当然也可以写树剖,不过这里DFS序更简单,因为都是对点到根的操作

  1. #include<cstdio>
  2. #include<vector>
  3. #include<algorithm>
  4. #pragma comment(linker, "/STACK:102400000,102400000")
  5. #define F(i,a,b) for(int i=a;i<=b;i++)
  6. #define root 1,n,1
  7. #define ls l,m,rt<<1
  8. #define rs m+1,r,rt<<1|1
  9. using namespace std;
  10.  
  11. const int N=1e5+,DEG=;
  12. int t,n,m,x,y,dp[N],sum[N],c1[N*],c2[N*];
  13. struct edge{int u,v,w,lca;}p[N];
  14. vector<int>vec[N];
  15. inline void add(int x,int k,int *c){for(;x<=n*;x+=x&-x)c[x]+=k;}
  16. inline int ask(int x,int *c){int an=;while(x)an+=c[x],x-=x&-x;return an;}
  17. //LCA+dfs序
  18. int ed,g[N],nxt[*N],v[*N],fa[N][DEG],dep[N],idx,l[*N],r[*N];
  19. inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
  20.  
  21. void LCA_dfs(int u,int pre){
  22. dep[u]=dep[pre]+,fa[u][]=pre,l[u]=++idx;
  23. F(i,,DEG-)fa[u][i]=fa[fa[u][i-]][i-];
  24. for(int i=g[u];~i;i=nxt[i])if(v[i]!=pre)LCA_dfs(v[i],u);
  25. r[u]=++idx;
  26. }
  27.  
  28. int LCA(int a,int b){
  29. if(dep[a]>dep[b])a^=b,b^=a,a^=b;
  30. if(dep[a]<dep[b])F(i,,DEG-)if((dep[b]-dep[a])&(<<i))b=fa[b][i];
  31. if(a!=b)for(int i=DEG-;i<?a=fa[a][]:,i>=;i--)
  32. if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];
  33. return a;
  34. }
  35.  
  36. void fuck(int s,int fa){
  37. dp[s]=sum[s]=;
  38. for(int i=g[s];~i;i=nxt[i])if(v[i]!=fa)fuck(v[i],s),sum[s]+=dp[v[i]];
  39. dp[s]=sum[s];
  40. for(int i=;i<vec[s].size();i++){
  41. int uu=p[vec[s][i]].u,vv=p[vec[s][i]].v;
  42. int tmp=ask(l[uu],c1)+ask(l[vv],c1)-ask(l[uu],c2)-ask(l[vv],c2)+sum[s];
  43. dp[s]=max(dp[s],tmp+p[vec[s][i]].w);
  44. }
  45. add(l[s],sum[s],c1),add(r[s],-sum[s],c1);
  46. add(l[s],dp[s],c2),add(r[s],-dp[s],c2);
  47. }
  48. void init(){
  49. F(i,,n)g[i]=-,vec[i].clear();ed=idx=;
  50. F(i,,n*)c1[i]=c2[i]=;
  51. }
  52.  
  53. int main(){
  54. scanf("%d",&t);
  55. while(t--){
  56. scanf("%d%d",&n,&m);
  57. init();
  58. F(i,,n-)scanf("%d%d",&x,&y),adg(x,y),adg(y,x);
  59. LCA_dfs(,);
  60. F(i,,m){
  61. scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
  62. p[i].lca=LCA(p[i].u,p[i].v);
  63. vec[p[i].lca].push_back(i);
  64. }
  65. fuck(,);
  66. printf("%d\n",dp[]);
  67. }
  68. return ;
  69. }

hdu_5293_Tree chain problem(DFS序+树形DP+LCA)的更多相关文章

  1. [JSOI2016]最佳团体 DFS序/树形DP

    题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...

  2. 【bzoj4182】Shopping 树的点分治+dfs序+背包dp

    题目描述 给出一棵 $n$ 个点的树,每个点有物品重量 $w$ .体积 $c$ 和数目 $d$ .要求选出一个连通子图,使得总体积不超过背包容量 $m$ ,且总重量最大.求这个最大总重量. 输入 输入 ...

  3. dfs序+RMQ求LCA详解

    首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...

  4. HDU 5296 Annoying problem dfs序 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Description Coco has a tree, w ...

  5. hdu5293(2015多校1)--Tree chain problem(树状dp)

    Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  6. poj3417 Network 树形Dp+LCA

    题意:给定一棵n个节点的树,然后在给定m条边,去掉m条边中的一条和原树中的一条边,使得树至少分为两部分,问有多少种方案. 神题,一点也想不到做法, 首先要分析出加入一条边之后会形成环,形成环的话,如果 ...

  7. HDU 1520 Anniversary party(DFS或树形DP)

    Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...

  8. Codeforces 916E(思维+dfs序+线段树+LCA)

    题面 传送门 题目大意:给定初始根节点为1的树,有3种操作 1.把根节点更换为r 2.将包含u,v的节点的最小子树(即lca(u,v)的子树)所有节点的值+x 3.查询v及其子树的值之和 分析 看到批 ...

  9. 【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)

    总述 这类题目都是求一个最长路径,这个路径可以不经过根节点. 使用dfs(即递归地遍历树)的方法.维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径.(若不使用全局变量 ...

随机推荐

  1. C 语言学习准备

    摘要:用 C#语言学习了一些数据结构,突然想学习 C 语言,为了学习C,本文准备好资料. C 语言学习准备 作者:乌龙哈里 时间:2015-11-17 平台:Window7 64bit,Visual ...

  2. lr_abort()、exit(-1) 和 return-1之间的区别

    int status; status = web_url("Login", "URL=https://secure.computing.com//login.asp?us ...

  3. 顺序表(C++实现)

    类实现代码如下: ;//默认的表空间大小 template <class T> class SeqList{ protected: T *data;//存放数组 int maxSize;/ ...

  4. 2.安装中国版本的firefox

    Linux刚安装好的时候,默认是火狐浏览器并且版本比较低,而且预装的是国际版 跟中国版无法同步,因为我windows上是中国版 首先去火狐主页,中文是http://www.firefox.com.cn ...

  5. OSGI.NET,请求因HTTP状态404 失败:Not Found

    在VS里使用OSGI.NET可以正常运行项目和插件,开放工厂远程管理工具也可以使用,没有任何异常.可是,当我把项目部署到IIS上,网站可以正常运行,插件也正常:使用开放工厂远程管理工具时,就出现&qu ...

  6. 开机启动遇到grub rescue,无法启动系统解决方法

    先使用ls命令,找到Ubuntu的安装在哪个分区: grub rescue>ls 会罗列出磁盘信息 (hd0)  (hd0,msdos9) (hd0,msdos8) (hd0,msdos7).. ...

  7. PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二

    一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字“-13142223336”是个11位数,其中有3个2,并且 ...

  8. JavaScript事件响应的基础语法总结

    1.onclick是鼠标单击事件,当在网页上单击鼠标时,就会发生该事件.同时onclick事件调用的程序块就会被执行,通常与按钮一起使用 //例子 <html> <head> ...

  9. ubuntu环境下docker安装步骤

    本文是根据docker官方文档翻译,原文:https://docs.docker.com/engine/installation/linux/ubuntulinux/ Docker 支持以下 Ubun ...

  10. hdu 1408 盐水的故事

    Problem Description 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴,停一下...,现在有一个问题:这瓶盐水一共有VUL毫升,每一滴是D毫升,每一滴 ...