传送门

题目大意

  给定一棵树, n − 1 n-1 n−1条边。问如何在边上填数(范围从0到n-1,且每个数仅出现一次)使得 S S S 最小
S = ∑ 1 ≤ u , v ≤ n m e x ( u , , v ) S = \sum_{1\leq u,v \leq n}mex(u,,v) S=1≤u,v≤n∑​mex(u,,v)
其中 m e x ( u , v ) mex(u, v) mex(u,v)表示从u到v的路径上最小没出现的自然数。
数据范围: 2 ≤ n ≤ 3000 2 \leq n \leq 3000 2≤n≤3000

解题思路

  假设我们已经知道填0的边所在的位置(边 < u , v > <u,v> <u,v>),那么填1的边与u或者v相连一定最优。如果找到一条边<u, w>填1,那么填2的边一定与w或者v相连最优,以此类推,可以发现我们似乎就在维护一个链,而这条链一但确定,其它边不管怎么填都不会影响答案。
  再考虑如果我们在上面的链上加入一条边时答案该如何变化。如果加入一条边后,答案会增加u,v子树中所有点对的数量,也就是子树大小的乘积。
  这就把问题转化成了一个类似区间dp的问题。如果我们想求链从u到v时的答案 f [ u ] [ v ] f[u][v] f[u][v],那么 f [ u ] [ v ] = m a x ( f [ f a [ v ] [ u ] ] [ v ] , f [ u ] [ f a [ u ] [ v ] ] ) + s u m [ u ] [ v ] ∗ s u m [ v ] [ u ] f[u][v] = max(f[fa[v][u]][v], f[u][fa[u][v]]) +sum[u][v]*sum[v][u] f[u][v]=max(f[fa[v][u]][v],f[u][fa[u][v]])+sum[u][v]∗sum[v][u]
其中 f a [ u ] [ v ] fa[u][v] fa[u][v]表示在以u为根的树中,v的父节点, s u m [ u ] [ v ] sum[u][v] sum[u][v]表示在以u为根结点的子树中,v结点子树的大小。这两个通过 O ( n 2 ) O(n^2) O(n2)的预处理就能得到。
  该dp方程类似于区间dp的方程, f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] ) + w [ i ] [ j ] f[i][j]=max(f[i-1][j], f[i][j-1])+w[i][j] f[i][j]=max(f[i−1][j],f[i][j−1])+w[i][j]
此题可以看作区间dp在树上的一种变形。

代码实现

#include <bits/stdc++.h>
using namespace std;
using LL = long long;const int MAXN = 6005;
int head[MAXN], nxt[MAXN], to[MAXN], sze, n;
inline void AddEdge(int u, int v) {nxt[++sze] = head[u]; to[head[u] = sze] = v;
}
int sum[MAXN][MAXN], fa[MAXN][MAXN];
LL f[MAXN / 2][MAXN / 2]; // 不除2会炸内存
void dfs(int root, int u, int faa) {fa[root][u] = faa;sum[root][u] = 1;for (int e = head[u]; e; e = nxt[e]) {if (to[e] == faa) continue;dfs(root, to[e], u);sum[root][u] += sum[root][to[e]];}
}
LL dp(int u, int v) {if (u == v) return f[u][v] = 0;if (u > v) swap(u, v);if (f[u][v] != -1) return f[u][v];f[u][v] = max(dp(u, fa[u][v]), dp(v, fa[v][u])) + (LL)sum[u][v] * sum[v][u];return f[u][v];
}
int main() {scanf("%d", &n);for (int i = 1; i < n; i++) {int u, v; scanf("%d%d", &u, &v);AddEdge(u, v); AddEdge(v, u);} for (int i = 1; i <= n; i++) dfs(i, i, i);memset(f, -1, sizeof(f));LL ans = 0;for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) ans = max(ans, dp(i, j));printf("%lld", ans);return 0;
}

CF1293E Xenon‘s Attack on the Gangs相关推荐

  1. Codeforces 1292C Xenon's Attack on the Gangs

    题目链接 Codeforces 1292C Xenon's Attack on the Gangs 题目大意 给定一棵树,将 [ 0 , n − 2 ] [0,n-2] [0,n−2]内的每个整数都仅 ...

  2. Xenon's Attack on the Gangs Codeforces Round #614 (Div. 2)

    Xenon's Attack on the Gangs 题意: 给你一棵树,将0~n-2一一赋值给n-1条边,则S最大可能取值 S = ∑ 1 ≤ u < v ≤ n m e x ( u , v ...

  3. E. Xenon's Attack on the Gangs,Codeforces Round #614 (Div. 2),树形dp

    E. Xenon's Attack on the Gangs http://codeforces.com/contest/1293/problem/E On another floor of the ...

  4. Codeforces Round #614 (Div. 2) E. Xenon's Attack on the Gangs(DP记忆化搜索+思维)

    题目链接:https://codeforces.com/contest/1293/problem/E 题目大意:   给出一棵树,要求给树的每条边赋权值,使得树中所有点的 m e x ( x , y ...

  5. Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西

    This way 题意: 现在有一棵大小为n的树,你要往边上放0~n-2这n-1个数,定义mex(u,v)表示u到v路径上的第一个未出现的自然数,定义S 问你S最大是多少. 题解: 我感觉这道题绝不止 ...

  6. Xenon's Attack on the Gangs(树规)

    题干 Input Output Example Test 1: Test 2: 3 5 1 2 1 2 2 3 1 31 43 53 10 Tips 译成人话 给n个结点,n-1条无向边.即一棵树.我 ...

  7. cf1292 C. Xenon's Attack on the Gangs

    Link Link Solution 居然还有这样的 d p dp dp,感觉就像是区间 d p dp dp上树一样 首先考虑到一步转化: ∑ ( u , v ) m e x ( u , v ) = ...

  8. C. Xenon's Attack on the Gangs(树形dp)

    http://codeforces.com/problemset/problem/1292/C 题意: 给出一棵树,n个点,你将0至n-2这n-1个数填到每条边上.一条路径的权值为最小的没有出现过的自 ...

  9. CF1292C Xenon‘s Attack on the Gangs

    https://www.luogu.com.cn/problem/CF1292C 考虑从小到大放数 发现只有一条链的会产生贡献(放的数会连成一条链) 然后DP即可 #include<bits/s ...

最新文章

  1. 解决Vue刷新一瞬间出现样式未加载完或者出现Vue代码问题
  2. 【详解】()调试方法从线索(错误征兆)出发,通过分析这些线索之间的关系而找出故障,是从个别推断一般的方法。
  3. 程序员幽默:伤不起,我就是这样的程序员
  4. 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
  5. 新闻发布系统C语言,资讯 | 助力期末之c语言专场圆满结束!
  6. 一文搞懂IT基础知识,讲通HTTP、TCP、IP、以太网
  7. 6 QM配置-质量计划配置-定义检验特性的编号范围
  8. MySQL的基本命令
  9. 巨蟒django之CRM2 展示客户列表分页
  10. Ubuntu 20.04 配置vim编辑器
  11. linux I2C读写应用程序
  12. pert计算公式期望值_信息系统项目管理师计算题详解:PERT(计划评审技术)计算...
  13. 计算机t恤,PS一分钟技巧!给T恤加个图案竟然这么简单
  14. ImageWatch无法显示图像
  15. attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
  16. Oracle总结一(超详细)
  17. scalac: Token not found...
  18. Android加载本地大Bitmap文件,解析出来的Bitmap是整张图片是黑色的
  19. 递推递归练习 B - 王小二切饼
  20. 在编辑页面移动选中的代码

热门文章

  1. 《朱子治家格言》原文
  2. 如何删除2345SafeCenterSvc
  3. 爬虫python教程百度云_【宝宝学爬】宝宝几个月会爬,婴儿几个月会爬,宝宝几个月会走路 - 妈妈网百科...
  4. 海鲜和水果不能一起吃吗?
  5. 挖掘人工智能心理学新方向
  6. 物体长度测量---------C#+Emgucv
  7. [原创] PowerPC 汇编入门与优化
  8. 城市大脑与超级智能城市建设规范研究
  9. 户外设备选择远距离蓝牙需要了解的知识-----工程师必看
  10. 视频原声可以一键快速消除并更换新的吗