题目链接: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. 使用python3编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。

    代码如下: import random n = 0 sum = 0 while n < 10: num = random.randint(1, 100) sum = sum + num n += ...

  2. WEB渗透之扫描 - Nikto

    2020.0202 好事成双 Nikto 纯主动 识别软件版本 存在安全隐患的文件 配置漏洞 web应用安全隐患 避免404误判 使用 插件:nikto -list-plugins 避免404误判功能 ...

  3. vnstat 流量统计 并附带一个小 php 查看流量的页面

    安装apt-get install vnstat 配置到自动启动update-rc.d vnstat enable 启动/etc/init.d/vnstat start vnstat基本使用命令 vn ...

  4. Python实现对excel的操作

    1.操作excel使用第三方库openpyxl安装:pip install openpyxy引入:import openpyxl2.常用简单操作1)打开excel文件获取工作簿wb = openpyx ...

  5. wpf 菜单样式和绑定树形数据

    前言 在wpf开发中,经常会使用到Menu和ContentMenu.但是原生的样式比较简陋,对于比较追求界面美好的人来说是十分不友好的.那么,这就涉及到对Menu的样式修改了.与此同时,我们还希望Me ...

  6. Ubuntu18.04 从头开始编译 Android Native WebRTC

    本文详细记录Mac下使用PD虚拟机安装ubuntu18.4桌面版,编译Android Native WebRTC的过程. 注意如果仅仅是使用WebRTC没必要手动编译源码,直接用官方提供的预编译包即可 ...

  7. Docker学习-私有仓库docker-registry的使用

    1.从docker官方仓库下载registry 2.将registry放进容器内 3.在官方下载镜像上传本地仓库 4.私有仓库docker-registry使用的常见问题 5.配置阿里云镜像加速器 假 ...

  8. 爬虫如何使用phantomjs无头浏览器解决网页源代码经过渲染的问题(以scrapy框架为例)

    一.浏览器的构成 许多开发商提供了商用的浏览器来解释和显示Web文档,而所有这些浏览器几乎都使用相同的体系架构.每一种浏览器(browser)通常由三部分构成:一个控制程序,客户协议和一些解释程序.控 ...

  9. Journal of Proteome Research | Global Proteomic Analysis of Lysine Succinylation in Zebrafish (Danio rerio) (解读人:关姣)

    文献名:Global Proteomic Analysis of Lysine Succinylation in Zebrafish (Danio rerio)(斑马鱼赖氨酸琥珀酰化的全球蛋白质组学分 ...

  10. rest_framework之认证与权限 token不存数据库认证

    1. 认证 : 介绍: UserInfo表包含name , pwd , user_type三个字段 UserToken表包含token与user(关联UserInfo表) 当用户登录成功将随机字符串写 ...