题目链接:https://codeforces.com/problemset/problem/1292/C

题意

在一颗有n个节点的树上,给每个边赋值,所有的值都在\([0,n-2]\)内并且不重复,也就是一条边一个权值,令\(mex(u,v)\)表示从\(u到v\)这条简单路径上没有出现过的最小自然数,要求使所有路径的\(mex\)之和最大。

分析

最开始我一看这个题,统计答案的时候好像就需要\(O(N^2)\),那这个题好像统计个答案就可能会T?当我看见时限是\(3s\)的时候我就知道我想多了,分析时间复杂度的时候提前看一下时限,防止因看错时限分析错时间复杂度。

首先这个边的权值肯定有规律,不然枚举权值时间复杂度会很高,最开始我想的是从每个边开始\(dfs\)一下把经过次数最多的边设成0,然后依次类推,每次\(dfs\)不访问重复经过的点,发现存在一个什么问题呢,就是从不同的点开始\(dfs\)造成的结果不一样,所以这样不可行,不妨先画一条链来看看。



如果已经放好了\(0~x-1\),考虑\(x\)放哪个位置,如果我把\(x\)放到\(5-v\)上,那么\(mex(u,5)\)就会是\(x\),然后只有\(mex(u,v)\)会等于\(x+1\),但要是把\(x\)放到\(u-1\)或\(4-5\)上,\(mex\)等于\(x+1\)的就不会只是\(mex(u,v)\)了。链上是这样,树上当然也是,所以\(x\)放到链的两端会使结果更优。



也就是这样,对于\(u-v\)的路径,4和5放在最两端时结果会更优,然后对最大值5的位置进行分类讨论,就可以求解出答案。

还有一个问题,如果我真的去把每个\(mex\)相加,的确很不现实,根据之前做过的一些类似的题,直接加上\(x\)相当于在\(0~x-1\)各加1,转化成对答案的贡献,也就是\(size_u*size_v\),这样求解起来就会相对简单。

之前已经讲过,从不同的点开始\(dfs\)的结果是不同的,所以不能像平常那样统计\(size\),而是应该在加一维表示根,这样才能保证得到我们想要的\(size\),因为要枚举最大权值所在的地方,所以还要记录每个节点的父亲,同样也要记录根。

不妨用\(dp_{u,v}\)表示把\(0~x-1\)放到\(u-v\)的最大答案,\(s_{u,v}\)表示\(v\)以\(u\)为根时的子树大小,\(fa_{u,v}\)表示\(v\)以\(u\)为根时的父亲。于是有

\[dp_{u,v}=max(dp_{fa_{u,v},u},dp_{fa_{v,u},v})+s_{u,v}*s_{v,u}
然后此题就能得解,注意开long long
```
#include<iostream>
#define ll long long
using namespace std;
const int N=3e3+10;
struct Edge{
int to,nxt;
}e[N<<1];
int Head[N],len;
void Ins(int a,int b){
e[++len].to=b;e[len].nxt=Head[a];Head[a]=len;
}
int rt;ll s[N][N],dp[N][N],f[N][N];
void dfs(int u){
s[rt][u]=1;
for(int i=Head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f[rt][u])continue;
f[rt][v]=u;
dfs(v);
s[rt][u]+=s[rt][v];
}
}
ll calc(int u,int v){
if(u==v)return 0;
if(dp[u][v])return dp[u][v];
return (dp[u][v]=max(calc(f[u][v],u),calc(f[v][u],v))+s[u][v]*s[v][u]);
}
int main(){
int n;
cin>>n;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
Ins(a,b);Ins(b,a);
}
for(int i=1;i<=n;i++)rt=i,dfs(i);
ll ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans=max(ans,calc(i,j));
cout<<ans;
}
```\]

CF1292C Xenon's Attack on the Gangs的更多相关文章

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

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

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

  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. Xenon's Attack on the Gangs,题解

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

  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. 【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源

    这一阵花了些时间,把 cocos2d-html5 里的sample 游戏<Fruit Attack>给移植到了WP8上来,目前已经实现了基本的功能,但是还有几个已知的bug,比如WP8只支 ...

  9. Web 服务器 low bandth DOS attack

    https://www.owasp.org/images/0/04/Roberto_Suggi_Liverani_OWASPNZDAY2010-Defending_against_applicatio ...

随机推荐

  1. IOS手动添加的View 在代码中使用(自动布局)autoLayout

    - (void)viewDidLoad { [super viewDidLoad]; UIButton *btnTest = [UIButton buttonWithType:UIButtonType ...

  2. PHP数组的升序降序函数

    数组排序函数:::sort()对数组进行升序排列rsort()对数组进行降序排列 asort()根据关联数组的值,对数组进行升序排列ksort()根据关联数组的键,对数组进行升序排列 arsort() ...

  3. pikachu——暴力破解

    前述: 前面学习了sqli-labs 和 DVWA,也算是初步涉足了web漏洞,了解了一些web漏洞的知识.所以在pikachu上面,会更加仔细认真,把前面没有介绍到的知识点和我一边学习到的新知识再补 ...

  4. 一致性hash算法之php实现

    源码地址:https://github.com/killallspree/myFrame/blob/master/framework/components/Flexihash.php

  5. CSS核心概念之盒子模型

    盒子模型(Box Model) 关于更多CSS核心概念的文章请关注GitHub--CSS核心概念. 当对一个文档进行布局的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basi ...

  6. js Vquery

    // JavaScript Document function myAddEvent(obj,sEv,fn){ alert('fn:'+fn); if(obj.attachEvent){ obj.at ...

  7. Java并发编程学习前期知识下篇

    Java并发编程学习前期知识下篇 通过上一篇<Java并发编程学习前期知识上篇>我们知道了在Java并发中的可见性是什么?volatile的定义以及JMM的定义.我们先来看看几个大厂真实的 ...

  8. .NET Core学习笔记(5)——WebAPI从Server端push消息到Client

    标题起得有点厉害,汉字夹杂着E文,不符合教育部公布的“向社会推荐使用的外语词中文译名”规范.不过他管不着我.写本篇的起因,是重构一个现有的WinForms程序,将Server端的部分逻辑从raw so ...

  9. WebRTC的RTCPeerConnection()原理探析

    从getUserMedia()到RTCPeerConnection(),自认为难度陡增.我想一方面是之前在Linux平台上学习ROS调用摄像头时,对底层的外设接口调用.摄像头参数都有学习理解:另一方面 ...

  10. 【简说Python WEB】数据库

    目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...