noip2014T2树形dp/分拆优化

我的方法还是很笨的吧,虽然想到是树形dp但是一直推不出来,原因应该是没有认真分析出他要怎么转移过来。下次要清醒的模拟一下应该不难。

3728 联合权值

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题解

题目描述 Description

输入描述 Input Description

输出描述 Output Description

样例输入 Sample Input

样例输出 Sample Output

-----------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
const int nmax=200001;
vector<int>f[nmax];
ll w[nmax];
ll read(){
  ll x=0;
  char c=getchar();
  while(!isdigit(c)) c=getchar();
  while(isdigit(c)){
    x=x*10+c-‘0‘;
    c=getchar();
  }
  return x;
}
int main(){
   int n=read();
   for(int i=1;i<n;i++){
     int u=read(),v=read();
     f[u].push_back(v);
     f[v].push_back(u);
   }
   for(int i=1;i<=n;i++){
     w[i]=read();
   }
   ll ans1=-1;
   for(int i=1;i<=n;i++){
      ll Max=0;
      for(int j=0;j<f[i].size();j++){
          ans1=max(ans1,w[f[i][j]]*Max);
          Max=max(w[f[i][j]],Max);
      }
   }
   ll ans=0;
   for(int i=1;i<=n;i++){
      ll tmp=0;
      for(int j=0;j<f[i].size()-1;j++){
         tmp+=w[f[i][j]];
         ans+=tmp*w[f[i][j+1]];
      }
   }
   printf("%lld %lld\n",ans1,ans*2%10007);
   return 0;
}

-----------------------------------------------------------------------------------

下面是师兄的做法:

-----------------------------------------------------------------------------------

void dfs(int x, int fa = -1) {
    mx[x] = cnt[x] = 0;
    for(edge* e = head[x]; e; e = e->next) if(e->to != fa) {
        dfs(e->to, x);
        ans = max(ans, w[x] * mx[e->to]);
        ans = max(ans, w[e->to] * mx[x]);
        tot = (tot + w[x] * cnt[e->to] + w[e->to] * cnt[x]) % MOD;
        (cnt[x] += w[e->to]) %= MOD;
        mx[x] = max(mx[x], w[e->to]);
    }
}

-----------------------------------------------------------------------------------

时间: 2024-12-06 14:36:18

noip2014T2树形dp/分拆优化的相关文章

fwt优化+树形DP HDU 5909

1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include <bits/stdc++.h> 6 // #include <iostream> 7 // #include <cstdio> 8 // #include <cstdlib> 9 // #include <algorithm> 10 // #inc

[NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构

题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接. 为了方便起见,我们将全国的 n 个城市用 1 到 n 的整数编号.其中SZ市的编号为 1. 对于除SZ市之外的任意一个城市 v,我们给出了它在这棵树上的父亲城市 fv 以及到父亲城市道路的长度 sv. 从城市 v 前往SZ市的方法为:选择城市 v 的一个祖先 a,支付购票的费用,乘坐交通工具到

[vijos1892]树上的最大匹配(树形DP)

题目:https://vijos.org/p/1892 分析:(100分其实用到各种c++优化,没什么实际意义,所以弄70就可以了) 题目很简单,很容易想出用树形DP,但是求方案数的时候,满满都是细节……,本渣考试时候就跪了……只能膜拜神犇代码…… 1 #include <cstdio> 2 #include <cstring> 3 //#include <algorithm> 4 5 using namespace std; 6 7 typedef long long

树形DP初探?总结

这几天,我自学了基础的树形DP,在此给大家分享一下我的心得.   首先,树形DP这种题主要就是解决有明确分层次且无环的树上动态规划的题.这种题型一般(注意只是基础.普通的情况下)用深度优先搜索来解决实际的DP部分,而且一般用记忆化搜索,因为树会有重复遍历节点的情况.在一棵树上针对普遍子树都满足根节点与两个子节点有特殊关系的,树形DP就应该是解决这道题的优选方法了.   讲完基础的定义,我们来讲几个挺有用的性质: 1.在一棵二叉树上,已知其中序遍历,它的任一个节点都可以成为它的根节点,对于每一个子

[Bzoj3677][Apio2014]连珠线(树形dp)

3677: [Apio2014]连珠线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 434  Solved: 270[Submit][Status][Discuss] Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色和蓝色.游戏 开始时,只有1个珠子,而接下来新的珠子只能通过线由以下两种方式被加入: 1.Append(w,杪):-个新的珠子w

[DP总结]树形DP

树形DP 树形DP,顾名思义,是在树上进行DP操作,因此往往需要使用DP实现,在转移时,通常先递归求出子树中的解,再在根节点进行计算转移. 树中只有两种关系,一种是父子关系,一种是平行关系. 下面是几道简单的树形DP.从中我们可以窥出树形DP的本质. [luogu] P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是

树形DP——动态规划与数据结构的结合,在树上做DP

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文章当中背包一共有九讲,但除了竞赛选手,我们能理解到单调优化就已经非常出色了.像是带有依赖的背包问题,和混合背包问题,有些剑走偏锋,所以这里不多做分享.如果大家感兴趣可以自行百度背包九讲查看,今天我们来看一个有趣的问题,通过这个有趣的问题,我们来了解一下在树形结构当中做动态规划的方法. 这个问题题意很

HDU2196 Computer(树形DP)

和LightOJ1257一样,之前我用了树分治写了.其实原来这题是道经典的树形DP,感觉这个DP不简单.. dp[0][u]表示以u为根的子树中的结点与u的最远距离 dp[1][u]表示以u为根的子树中的结点与u的次远距离 这两个可以一遍dfs通过儿子结点转移得到.显然dp[0][u]就是u的一个可能的答案,即u往下走的最远距离,还缺一部分就是u往上走的最远距离: dp[2][u]表示u往上走的最远距离 对于这个的转移,分两种情况,是这样的: dp[2][v] = max( dp[0][u]+w

HDU 1011 Starship Troopers(树形dp+背包)

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13109    Accepted Submission(s): 3562 Problem Description You, the leader of Starship Troopers, are sent to destroy a base of