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 ...
随机推荐
- 纯正中文版本pi-star系统下载
基于3.4.17修改(稳定,发热量少) 不支持RPI 4 a/b+ 完美支持树莓派0,1,2,3 默认刷好卡,启动已经设置好所有参数(选好TFT屏幕,调制解调器类型GPIO,打开了DMR服务器(460 ...
- 信道估计(channel estimation)图解——从SISO到MIMO原理介绍
1. 引言 在所有通信中,信号都会通过一个介质(称为信道),并且信号会失真,或者在信号通过信道时会向信号中添加各种噪声.正确解码接收到的信号而没有太多错误的方法是从接收到的信号中消除信道施加的失真和噪 ...
- 移除VS解决方案中的TFS版本控制
项目每次会弹出提示 正在打开的解决方案已绑定到以下 Azure DevOps Server 上的源代码管理: xxxxx.是否要联系此服务器以尝试启用源代码管理集成? 移除VS解决方案中的TFS版本控 ...
- 温故知新-Mysql索引结构&页&聚集索引&非聚集索
文章目录 摘要 索引 索引概述 索引优势劣势 索引结构 BTREE 结构 B+TREE 结构 页 索引分类 索引语法 索引设计原则 聚触索引 & 非聚触索引 你的鼓励也是我创作的动力 Post ...
- 在MyEclipse中设置jdk
在MyEclipse中设置jdk的三处地方:1 选中项目右键菜单properties -->java Compiler 2 windows菜单中Preferences-->myeclips ...
- Vue-Cli4.x配置文件路径别名
一.目录结构 二.配置方法 提示:和package.json同级新建vue.config.js文件(可选文件,默认没有创建). const path = require('path');//引入pat ...
- 玩转华为物联网IoTDA服务系列三-自动售货机销售分析场景示例
场景简介 通过收集自动售货机系统的销售数据,EI数据分析售货销量状况. 该场景主要描述的是设备可以通过MQTT协议与物联网平台进行交互,应用侧可以到物联网平台订阅设备侧变化的通知,用户可以在控制台或通 ...
- Java并发相关知识点梳理和研究
1. 知识点思维导图 (图比较大,可以右键在新窗口打开) 2. 经典的wait()/notify()/notifyAll()实现生产者/消费者编程范式深入分析 & synchronized 注 ...
- @bzoj - 3711@ [PA2014]Druzyny
目录 @description@ @solution@ @accepted code@ @details@ @description@ 体育课上,n个小朋友排成一行(从1到n编号),老师想把他们分成若 ...
- C#中的闭包和意想不到的坑
虽然闭包主要是函数式编程的玩意儿,而C#的最主要特征是面向对象,但是利用委托或lambda表达式,C#也可以写出具有函数式编程风味的代码.同样的,使用委托或者lambda表达式,也可以在C#中使用闭包 ...