传送门

题目描述

输入格式

输出格式

题意翻译

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

样例

样例输入


样例输入一


样例输入二

样例输出

样例输出一

3

样例输出二

10

分析

我们先随便找一条边,将它的价值赋值成0

那么只要有一个路径经过这条边,那么这个路径的最小价值就一定不会为0

我们举一个例子

此时u到v的价值为0,那么这一条路径不经过的最小非负整数就是1

一条路径只要经过(u,v)这条边,那么它们不经过的最小非负整数就至少为1(因为它们已经经过了0)

我们用f[i][j]表示从i开始,从j结束,将i到j之间所有的m条边赋值成0到m-1所得到的最大价值

用g[i][j]表示在i号节点作为根节点的情况下,以j为根节点的子树的大小

用pa[i][j]表示在i号节点作为根节点的情况下,j节点的父亲节点

我们再来看上面这幅图,只要经过(u,v)这条边,那么它们没有经过的最小非负整数的价值就至少为1

此时总价值为g[u][v]*g[v][u]

那么我们再添加价值为1的边,为了使总的价值最大,这条边显然要和价值为0的边放在一起

为什么呢?因为如果放在别的地方,那么价值为1的路程会增多,而价值为2的路程会减少

换一句话说,价值为1的这条边对其它路程的贡献减少了

我们来举一个例子

在左边这幅图中,我们没有把价值为1的边放在价值为0的边的旁边,这时(u,B)这条边永远会缺失1,我们从v向下遍历,同时经过0和1的路径的个数会减少,会有很多路径的价值为1,以后也不会再改变

在右边这幅图中,我们有把价值为1的边放在价值为0的边的旁边,这时(u,B)这条边的边权1,它的价值也就为1,我们从v向下遍历,同时经过0和1的路径的个数显然要比上面的多,路径的价值一定会大于1

同样的,我们可以把2 、3、4……n-1(不一定会加到n-1,原因我们后面会说)依次填入,只要按照上面的方法就可以

但是还有一个问题,我们是从左边加还是从右边加呢

这是我们就需要用到动态转移方程取较大值

f[u][v]=max(f[u,pa[u][v]],f[v,pa[v][u]])+g[u][v]*g[v][u]

什么意思呢,我们还是拿图来说

我们假设u和v之间的边权都已经从小到大加完,那么其中最大的一个权值我们不是加在(u,pa[v][u])上,就是加在(v,pa[u][v])上

如果加在(u,pa[v][u])上,那么增大的价值就是g[u][v]*g[v][u],还要加上原来就有的f[u,pa[u][v]]

 如果加在(v,pa[u][v])上,那么增大的价值就是g[u][v]*g[v][u],还要加上原来就有的f[v,pa[v][u]]

实际上这两种情况增大的价值都是一样的,我们只需要在f[u,pa[u][v]]和f[v,pa[v][u]]中取最大值就可以了

最后我们再看一下最后的决策是什么情况

根据我们一开始的推论,边权从小到大一定会加在同一条链上,但是这一条链不一定会包含n-1条边,就像下面这样

标红色的是我们已经选好边权的边

这时我们会发现(2,3)(4,7)这两条边并没有被赋上相应的价值,这时该怎么办呢,最后的价值还是f[8][9]吗?

答案是肯定的,此时边权只剩下了最大的两个,无论加到那一条边上都不会对结果产生影响

那么3、7节点贡献的价值呢,实际上,在我们决策2、1、4这三个点时,3、7作为子树价值已经被确定了,无论你加多大的边权也不会改变路程没有经过的最小非负整数

代码的话,g、pa数组我们可以预处理得到,f数组我们枚举取最大值就可以了

这道题也要开long long否则会爆掉

代码

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int maxd=;
typedef long long ll;
struct asd{
ll from,to,next;
}b[maxd*];
ll head[maxd],tot=;
void ad(ll aa,ll bb){
b[tot].from=aa;
b[tot].to=bb;
b[tot].next=head[aa];
head[aa]=tot++;
}
ll pa[maxd][maxd],f[maxd][maxd],g[maxd][maxd];
ll rt=;
void dfs(ll now,ll fa){
g[rt][now]=;
for(ll i=head[now];i!=-;i=b[i].next){
ll u=b[i].to;
if(u==fa) continue;
pa[rt][u]=now;
dfs(u,now);
g[rt][now]+=g[rt][u];
}
}
ll solve(ll u,ll v){
if(u==v) return ;
if(f[u][v]) return f[u][v];
return f[u][v]=max(solve(u,pa[u][v]),solve(v,pa[v][u]))+g[u][v]*g[v][u];
}
int main(){
memset(head,-,sizeof(head));
ll n;
scanf("%lld",&n);
for(ll i=;i<n;i++){
ll aa,bb;
scanf("%lld%lld",&aa,&bb);
ad(aa,bb);
ad(bb,aa);
}
for(ll i=;i<=n;i++){
rt=i;
dfs(i,-);//递归,预处理s数组和pa数组
}
ll ans=-;
for(ll i=;i<=n;i++){
for(ll j=;j<=n;j++){
ans=max(solve(i,j),ans);//取最大值
}
}
printf("%lld\n",ans);
return ;
}

CF1292C 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

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

  3. Xenon's Attack on the Gangs,题解

    题目: 题意: 有一个n个节点的树,边权为0-n-2,定义mex(a,b)表示除了ab路径上的自然数以外的最小的自然数,求如何分配边权使得所有的mex(a,b)之和最大. 分析: 看似有点乱,我们先不 ...

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

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

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

  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. REDIS主从频繁切换事件排查

    目录 前言 现象 排查 结论 redis主从配置注意点 前言 目前生产配置了2台redis一主一从1.193和12.6,和3个哨兵.1.193,3.10,12.6,搭建的redis高可用环境.突然发生 ...

  2. zabbix 中文乱码

    环境 zabbix 3.4.7 centos 7.4 问题现象 zabbix 中文乱码     解决方法 1.先准备一个字体包    Windows路径 C:\Windows\Fonts\simkai ...

  3. android-sdk-window的环境搭建以及appium简单录制脚本的使用

    大家好,今天给大家带来的是appium的环境搭建以及简单的录制脚本,自学的过程中入了不少坑,下面给大家开始分享! 使用Appium录制脚本必备三大金刚:Appium-desktop(至于为什么用这个, ...

  4. Debian安装NVIDIA显卡驱动

    1. sudo apt-get install nvidia-detect nvidia-detect 输出信息: Detected NVIDIA GPUs: 01:00.0 VGA compatib ...

  5. Js中Array 函数使用方法

    遇到数组有关操作,脑子第一反应不要再是嵌套 for 循环了,Array 类型提供了一些遍历有关的函数. Array.prototype.forEach() : 把数组每个元素丢到一个处理 functi ...

  6. CPU性能分析工具原理

    转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/13067733.html 很多软件都要做性能分析和性能优化.很多语言都会有他 ...

  7. 税务ukey如何批量开票

    最近税局开始大力推税务ukey版本,不过目前接口还未开放,就连航信,百旺否还没有对应接口,所以自己研究了下,在之前税控基础上,谁知道搞定了,通过安装插件可以批量开票,包括纸质,电子发票ofd格式. 联 ...

  8. 【Spring】Bean的LifeCycle(生命周期)

    菜瓜:水稻,上次说Bean的LifeCycle,还没讲完 水稻:啥?说人话? 菜瓜:spring,bean,生命周期 水稻:哦哦,下次直接说人话.说正事,先从BeanFactory.Applicati ...

  9. 04.开发REST 接口

    使用Django开发REST 接口 我们以在Django框架中使用的图书英雄案例来写一套支持图书数据增删改查的REST API接口,来理解REST API的开发. 在此案例中,前后端均发送JSON格式 ...

  10. 【论文笔记】Pyramidal Convolution: Rethinking Convolutional Neural Networks for Visual Recognition

    地址:https://arxiv.org/pdf/2006.11538.pdf github:https://github.com/iduta/pyconv 目前的卷积神经网络普遍使用3×3的卷积神经 ...