题目:

  

题意:

  有一个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,题解的更多相关文章

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

  2. CF1292C Xenon's Attack on the Gangs 题解

    传送门 题目描述 输入格式 输出格式 题意翻译 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~ n-2不重复的值.mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小 ...

  3. 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条无向边.即一棵 ...

  4. 【树形DP】CF 1293E Xenon's Attack on the Gangs

    题目大意 vjudge链接 给n个结点,n-1条无向边.即一棵树. 我们需要给这n-1条边赋上0~ n-2不重复的值. mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小非负整数. 计算 ...

  5. CF1292C Xenon's Attack on the Gangs

    题目链接:https://codeforces.com/problemset/problem/1292/C 题意 在一颗有n个节点的树上,给每个边赋值,所有的值都在\([0,n-2]\)内并且不重复, ...

  6. Codeforces Round #614 (Div. 2) A-E简要题解

    链接:https://codeforces.com/contest/1293 A. ConneR and the A.R.C. Markland-N 题意:略 思路:上下枚举1000次扫一遍,比较一下 ...

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

  8. csp-s模拟测试51(b)attack,tree题解

    题面:https://www.cnblogs.com/Juve/articles/11598286.html attack: 支配树裸题? 看一下支配树是什么: 问题:我们有一个有向图(可以有环),定 ...

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

随机推荐

  1. PAT 德才论

    宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人 ...

  2. awardRotate转盘插件文字模糊问题和图片加载问题

    前言 最近在做一个转盘抽奖页面,使用了awardRotate.js发现字体和图片都有模糊,绘制的时候图片绘制不全,搜索一下之后发现针对awardRotate的解决方法比较少,针对canvas的比较多, ...

  3. centos 7 源码安装openssh

    环境:centos 7.1.1503 最小化安装 依赖包下载:  yum -y install lrzsz zlib-devel perl gcc pam-devel 1.安装openssl ,选用最 ...

  4. win7 64位系统怎么使用debug

    安装DOSbox软件 下载个debug.exe然后把这放到D盘或E盘的根目录下 然后启动dosbox软件,在下面输入 mount c d:\ enter键 c: enter键 输入debug命令就ok ...

  5. UBoot配置编译及Makefile分析

    一. UBoot配置编译初步分析 1. UBoot源码结构 (1)UBoot工程项目中的文件可以分为3类 ① 第1类目录:与处理器体系结构或开发板硬件直接相关 ② 第2类目录:一些通用的函数或驱动程序 ...

  6. Python:三元表达式、列表推导式和生成器表达式

    三元表达式 语法格式 如下: 为真时的结果 if 判断条件 else 为假时的结果 例子 name = input('姓名>>: ') res = '请进' if name == '张三' ...

  7. 初识Redis的数据类型HyperLogLog

    前提 未来一段时间开发的项目或者需求会大量使用到Redis,趁着这段时间业务并不太繁忙,抽点时间预习和复习Redis的相关内容.刚好看到博客下面的UV和PV统计,想到了最近看书里面提到的HyperLo ...

  8. pip安装mysql-connector

    pip install mysql-connector --index-url https://pypi.douban.com/simple

  9. salesforce零基础学习(九十八)Type浅谈

    在Salesforce的世界,凡事皆Metadata. 先通过一句经常使用的代码带入一下: Account accountItem = (Account)JSON.deserialize(accoun ...

  10. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...