Xenon's Attack on the Gangs,题解
题目:
题意:
有一个n个节点的树,边权为0-n-2,定义mex(a,b)表示除了ab路径上的自然数以外的最小的自然数,求如何分配边权使得所有的mex(a,b)之和最大。
分析:
看似有点乱,我们先不急着出答案,先想想这个式子,我们要求mex的和怎么办呢?我们想一想这个:一大堆节点-----一大堆节点(中间是个边权为0的边),于是,同一堆中节点节点无论从谁到谁,都逃不掉为0的命运,谁让它里面没有0呢,而如果从第一堆到第二堆(或从第二堆到第一堆,其实是一样的),那么他们的mex知少是1,因为除了0最小的自然数就是1了。好的,那么它至少为左边的节点的个数*右边的节点的个数。于是呢?我们再来想一想还有什么性质,经过深思熟虑,我们发现,如果0的左右节点都没有1,我们把1和某个节点换过来,它将会更优,为什么呢,首先,不过0的路径肯定mex=0,而过0的如果有过1和这个节点,交换之后它不变(因为过的节点都没变),如果过0和这个节点且不过1,那么他原来就是1,而换完之后便至少是2,如果原来过0和1,这个可以不用考虑,为什么呢:如果着个0和1已经相邻了,肯定不与要证命题想背,如果不临着,我就换成这个路径上临着的就完了,于是,我们有0有临必有1(这里的必指的是不会更差),同样的,我们可以证明如果路径a-b有n条边,且权值是0-n-1,则有临必(同上)有n。于是,我们知道了,这颗树满足性质A:0连接两点满足A,有0边权的边相连的两个节点存在两个在不同节点上的方向走到度为1的节点(当然,本身度为1也算),使得这些路径上的权值是从0开始连续的,并且去掉其中较大的度为1的节点仍满足性质A(注意是递归定义,不是去掉一次就算了)。这句话。。。我不知道我为啥要用这么长的一句话表述,不过我觉的我这句话还算比较明白的。
换一行,要不大家看不下去就麻烦了。。。
证明这个之后呢?没错我们要枚举让没两个度为1的节点都尝试做这两个节点,可是这怎么枚举呢,当然我们还要关注“主链”旁边的“支链”。我们想一下递归/推关系吧,我们定义fab表示a到b这条链为从0开始的链序自然数的序列至少会获得的价值(如果是两个度为1的节点,就是将会获得的价值),定义ffab表示a向b方向走一边所到的节点,fffab表示ab这条链必须经过a才能到达b的节点的个数。于是,fab=max(f(ffab)bf,fa(ffba))+fffab*fffba。这是啥。。。这个要怎么解释。。。用文字的话这个可能说的非常的数学化,大家可能不太喜欢,我就用朴实一点的语言描述一下(当然喜欢数学化语言的就去读一下第一段的部分内容吧),他是这样的fab其实就是链的左边是最大的还是列的右边是最大(此节点的权值为n)的,然后两边的节点由原来的至少n变为至少n+1于是都加上1就好了,于是式子出来了。
式子出来了,可是这个可以递推吗,其实这个没有必要(当然也应该算是可以,只是不占优势,直接递归就好了),我们直接用数组记录,然后每个值只会算到1次,于是就不会超时了。然后就是ffab和fffab怎么求出来呢?Dfs,n次dfs,ffab其实就是b为根a的父亲,fffab就是b为根时a的儿子节点,但是,有人说:可以二次元换根吗?这个问题。。。要处理的数据就是n*n个,怎么说你都要处理出来,就是n*n的复杂度,不换就好了,当然应该是可以换,就是处理麻烦一点(其实还是要赋原来的值)。
最后答案是什么呢,其实就是max(fab),那这不会出现最大的fab中a,b不是度为1的节点吗?看转移方程,不会吧。
long long用不用呢,这个应该是取决于一条3000的一条链的答案,可以自己跑一下试试,当然多用一些问题也不大。
好的,基本就这些,然后是代码。
#include <cstdio>
#include <string>
using namespace std;
const int maxn=+;
struct E{
int to;
int next;
E(){
to=next=;
}
}ed[maxn*];
int head[maxn];
int tot;
void J(int a,int b){
tot++;
ed[tot].to=b;
ed[tot].next=head[a];
head[a]=tot;
}
int son[maxn][maxn];//这里定义有点不同,大家应该可以理解
int P[maxn][maxn];
long long f[maxn][maxn];
void Dfs(int root,int x,int fa){
P[root][x]=fa;
son[root][x]=;
for(int i=head[x];i;i=ed[i].next){
if(ed[i].to==fa)
continue;
Dfs(root,ed[i].to,x);
son[root][x]+=son[root][ed[i].to];
}
}
long long Cl(int a,int b){//递归
if(a==b)
return ;
if(f[a][b])
return f[a][b];
return f[a][b]=max(Cl(P[b][a],b),Cl(P[a][b],a))+(long long)son[b][a]*(long long)son[a][b];//勤用long long少出错
}
int main(){
int n;
scanf("%d",&n);
int js1,js2;
for(int i=;i<=n-;i++){
scanf("%d%d",&js1,&js2);
J(js1,js2);
J(js2,js1);
}
for(int i=;i<=n;i++)//处理一些信息
Dfs(i,i,);
long long ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
ans=max(ans,Cl(i,j));
printf("%lld",ans);
return ;
}
Xenon's Attack on the Gangs,题解的更多相关文章
- Codeforces 1292C Xenon's Attack on the Gangs 题解
题目 On another floor of the A.R.C. Markland-N, the young man Simon "Xenon" Jackson, takes a ...
- CF1292C Xenon's Attack on the Gangs 题解
传送门 题目描述 输入格式 输出格式 题意翻译 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~ n-2不重复的值.mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小 ...
- Xenon's Attack on the Gangs(树规)
题干 Input Output Example Test 1: Test 2: 3 5 1 2 1 2 2 3 1 3 1 4 3 5 3 10 Tips 译成人话 给n个结点,n-1条无向边.即一棵 ...
- 【树形DP】CF 1293E Xenon's Attack on the Gangs
题目大意 vjudge链接 给n个结点,n-1条无向边.即一棵树. 我们需要给这n-1条边赋上0~ n-2不重复的值. mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小非负整数. 计算 ...
- CF1292C Xenon's Attack on the Gangs
题目链接:https://codeforces.com/problemset/problem/1292/C 题意 在一颗有n个节点的树上,给每个边赋值,所有的值都在\([0,n-2]\)内并且不重复, ...
- Codeforces Round #614 (Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1293 A. ConneR and the A.R.C. Markland-N 题意:略 思路:上下枚举1000次扫一遍,比较一下 ...
- Codeforces #614 div.2 (A-E)
A ConneR and the A.R.C. Markland-N #include <bits/stdc++.h> using namespace std; #define ll l ...
- csp-s模拟测试51(b)attack,tree题解
题面:https://www.cnblogs.com/Juve/articles/11598286.html attack: 支配树裸题? 看一下支配树是什么: 问题:我们有一个有向图(可以有环),定 ...
- HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...
随机推荐
- Python学习之温度转换实例分析篇
#TempConvert.py Tempstr=input('请输入要转换的温度值:') if Tempstr[-1] in ['C','c']: F=1.8*eval(Tempstr[0:-1])+ ...
- DMR对讲机利用XLX网络联网通信
By 申建军 BD8SN 2018-9-29 本文适用于运行G4KLX DMRGateway的MMDVM热点和中继,目前国内绝大部分的热点用户都是使用pi-star镜像的MMDVM热点,均可按此设置. ...
- 曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?
如何计算,一对key/value应该放在哪个哈希桶 大家都知道,hashmap底层是数组+链表(不讨论红黑树的情况),其中,这个数组,我们一般叫做哈希桶,大家如果去看jdk的源码,会发现里面有一些变量 ...
- 滴滴HBase大版本滚动升级之旅
桔妹导读:滴滴HBase团队日前完成了0.98版本 -> 1.4.8版本滚动升级,用户无感知.新版本为我们带来了丰富的新特性,在性能.稳定性与易用性方便也均有很大提升.我们将整个升级过程中面临的 ...
- Android 图片裁剪踩坑
今天做图库图片的裁剪遇到了不少坑,今天记录一下,以下坑位供各位看官参考: 如果有不对之处,欢迎各位看官留言评论! 图片裁剪踩坑锦囊: 问题一:相册裁剪权限问题 解:这个简单,对于Android6. ...
- Linux中使用expect脚本实现远程机器自动登录_linux shell
首先创建一个expect脚本ssh_expect,文件内容如下: #!/usr/bin/expect -f set hostname [lindex $argv 0] set user [lindex ...
- layui 通过laytpl模板,以及laypage分页实现
一.引用js依赖 jquery-1.11.3.min.js , layui.all.js, json2.js 二.js分页方法封装(分页使用模板laytpl) 1.模板渲染 /** * 分页模板的渲 ...
- Embed Tomcat Java(内嵌tomcat启动简述)
简单记录一下内部tomcat启动 maven pom.xml <dependencies> <!-- embed tomcat dependency --> <depen ...
- <Win10开发>UWP使用.Net Native编译时遇到的一些问题。
最近开始尝试把WP8.1 Runtime的项目升级成Win10 UWP,我用的方法没什么技巧性,就是直接复制文件和代码到新建的UWP项目.结果是后台代码未经修改,全部正常运行.但是UI控件的布局有些偏 ...
- Winner Winner【模拟、位运算】
Winner Winner 题目链接(点击) 题目描述 The FZU Code Carnival is a programming competetion hosted by the ACM-ICP ...