题目链接

Codeforces 1292C Xenon’s Attack on the Gangs

题目大意

给定一棵树,将 [ 0 , n − 2 ] [0,n-2] [0,n−2]内的每个整数都仅用一遍填到每条边上,使得 ∑ 1 ≤ u ≤ v ≤ n m e x ( u , v ) \sum_{1\leq u\leq v\leq n}mex(u,v) ∑1≤u≤v≤n​mex(u,v)最大, m e x ( u , v ) mex(u,v) mex(u,v)表示从结点 u u u到结点 v v v经过的边集 A u , v A_{u,v} Au,v​中未出现的最小非负整数。

解题思路

我们先来考虑样例,图是这样的:

那么,我们想一下边权为 0 0 0的这条边,它的贡献是多少,根据乘法原理,即
w e i g h t [ i ] = l e f t [ i ] ∗ r i g h t [ i ] , weight[i]=left[i]*right[i], weight[i]=left[i]∗right[i],
它的贡献就是左边的点数 × × ×右边的点数, 3 × 2 = 6 3×2=6 3×2=6。左边是 ( 1 , 2 , 4 ) (1,2,4) (1,2,4),右边是 ( 3 , 5 ) (3,5) (3,5)。

接下去我们算一下边权为 1 1 1的边,但是单单一个边权为 1 1 1的边是做不出任何贡献的,因为有比 1 1 1更小的非负整数 0 0 0,所以这条边必须和边权为 0 0 0的边连在一起才能做出贡献,那么左边的点是 ( 1 , 2 , 4 ) (1,2,4) (1,2,4),右边的点是 ( 5 ) (5) (5),贡献是 3 × 1 = 3 3×1=3 3×1=3。

同理,边权为 2 2 2的边要和边权为 0 0 0的边,边权为 1 1 1的边组成一条链,所以左边的点是 ( 4 ) (4) (4),右边的点是 ( 5 ) (5) (5),贡献是 1 × 1 = 1 1×1=1 1×1=1。

但是边权为 3 3 3的边是做不出任何贡献的,因为这条边和边权为 0 , 1 , 2 0,1,2 0,1,2的边无法组成一条链,它包含不了 0 − 3 0-3 0−3的所有数。

所以样例的答案就是 6 + 3 + 1 = 10 6+3+1=10 6+3+1=10。

可能还有疑惑的地方,比如边权为 2 2 2的边和边权为 0 , 1 0,1 0,1的边连起来后每次贡献应该是最小非负整数 2 + 1 = 3 2+1=3 2+1=3,为什么每个的贡献都是 1 1 1呢?

因为我们在边权为 0 0 0的边的时候已经加了 1 1 1的贡献,那么边权为 1 1 1的边只是在原来的基础上叠加 2 2 2的贡献,边权为 2 2 2的这条边,只需在贡献 1 , 2 1,2 1,2的边上叠加一层 3 3 3的贡献。

所以我们的做法就是:在树上找所有的链再计算贡献。
C o d e Code Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=3005;
long long dp[maxn][maxn],cnt[maxn][maxn];
int fa[maxn][maxn],h[2*maxn],nxt[2*maxn],to[2*maxn],n,x,y,ct;
void dfs(int x,int f,int root){cnt[root][x]=1;fa[root][x]=f;for(int i=h[x];i;i=nxt[i]){int v=to[i];if(v==f)continue;dfs(v,x,root);cnt[root][x]+=cnt[root][v];}
}
long long solve(int x,int y){if(x==y)return 0;if(dp[x][y]!=-1)return dp[x][y];dp[x][y]=cnt[y][x]*cnt[x][y]+max(solve(fa[y][x],y),solve(x,fa[x][y]));return dp[x][y];
}
int main(){cin>>n;for(int i=1;i<n;i++){cin>>x>>y;x--,y--;to[++ct]=y,nxt[ct]=h[x],h[x]=ct;to[++ct]=x,nxt[ct]=h[y],h[y]=ct;}for(int i=0;i<n;i++)dfs(i,-1,i);memset(dp,-1,sizeof(dp));long long ans=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)ans=max(ans,solve(i,j));cout<<ans<<endl;
}

这边有个视频讲得还不错,值得看看,bilibili。

Codeforces 1292C Xenon's Attack on the Gangs相关推荐

  1. CodeForces - 1292C Xenon‘s Attack on the Gangs(思维+dp)

    题目链接:点击这里 题目大意: 给出一颗有 n n n 个节点的数,将 [ 0 , n − 2 ] [0,n-2] [0,n−2] 内的每个整数各用一次分配到这颗树的 n − 1 n-1 n−1 条边 ...

  2. 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 ...

  3. 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 ...

  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. Codeforces Round #614 (Div. 1) C.Xenon's Attack on the Gangs(树形dp)

    题目 给你一棵n(n<=3000)个点的树,树上每个点对(u,v)对答案的贡献是mex(u,v), mex就是sg函数里的那个mex 每个点对只被统计一次,令所有点对的贡献和最大,输出贡献和 思 ...

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

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

  8. codeforces1292C Xenon‘s Attack on the Gangs

    https://codeforces.com/problemset/status 这题一开始想着dfs贪心贪了好久,后来发现如果出现贡献相等的情况,不知道取那边扩展.花了很多时间才想出来,打cf的时候 ...

  9. CF1293E Xenon‘s Attack on the Gangs

    传送门 题目大意   给定一棵树, n − 1 n-1 n−1条边.问如何在边上填数(范围从0到n-1,且每个数仅出现一次)使得 S S S 最小 S = ∑ 1 ≤ u , v ≤ n m e x ...

最新文章

  1. java中子类对父类中的私有变量和私有方法有拥有权无使用权
  2. 转 知道这20个正则表达式,能让你少写1,000行代码
  3. python虚拟环境搭建mac_mac搭建python virtualenv虚拟环境并使用 - 李金龙
  4. Java 11新特性_java 11 值得关注的新特性
  5. matlab 计算 工程,matlab工程计算.doc
  6. Qt Creator 4.9 发布
  7. Tkinter文件夹选择路径功能+打开位置目录功能(Python3.6.X)
  8. 彩翼系列-彩票分析软件源代码(双色球,排三,排五,3D,22选5,30选7)源代码
  9. ThinkPad T14 Gen3拆机更换升级内存和固态硬盘
  10. 定制puttygen
  11. MacOS brew 仓库URL源替换方法
  12. python 兼职多少钱一小时_无印良品兼职一小时多少钱?看完后就清楚了!
  13. C++ STL求全排列和组合
  14. mac svn 服务器及客户端
  15. [python爬虫]暴力破解Wifi密码
  16. Neutron 架构
  17. 比较IC卡、ID卡、M1卡、CPU卡它们之间有什么区别?
  18. 全球及中国便携式蓝牙音箱行业研究及十四五规划分析报告
  19. 【cartographer without ros】六、路标landmark数据转换
  20. Git详解之七 自定义Git

热门文章

  1. config.c 或者config.s 依照os的不同而config.X 的X也是不同的:
  2. .NET(C#):await返回Task的async方法
  3. 实验整理(一)——钓鱼邮件攻击实验
  4. 跨域 CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
  5. AriaNg 是一个让 aria2 更容易使用的现代 Web 前端
  6. Centos下安装SSH、FTP服务
  7. groupby后选取列和不选取列的区别
  8. 怎么确定电脑上没有mysql_怎么检查电脑有没有mysql?
  9. Android-小游戏
  10. C. Petya and Exam