CF1292C Xenon's Attack on the Gangs
题目链接: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\)为根时的父亲。于是有
然后此题就能得解,注意开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的更多相关文章
- CF1292C Xenon's Attack on the Gangs 题解
传送门 题目描述 输入格式 输出格式 题意翻译 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~ n-2不重复的值.mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小 ...
- 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 ...
- 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条无向边.即一棵 ...
- Xenon's Attack on the Gangs,题解
题目: 题意: 有一个n个节点的树,边权为0-n-2,定义mex(a,b)表示除了ab路径上的自然数以外的最小的自然数,求如何分配边权使得所有的mex(a,b)之和最大. 分析: 看似有点乱,我们先不 ...
- 【树形DP】CF 1293E Xenon's Attack on the Gangs
题目大意 vjudge链接 给n个结点,n-1条无向边.即一棵树. 我们需要给这n-1条边赋上0~ n-2不重复的值. mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小非负整数. 计算 ...
- 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 ...
- 【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源
这一阵花了些时间,把 cocos2d-html5 里的sample 游戏<Fruit Attack>给移植到了WP8上来,目前已经实现了基本的功能,但是还有几个已知的bug,比如WP8只支 ...
- Web 服务器 low bandth DOS attack
https://www.owasp.org/images/0/04/Roberto_Suggi_Liverani_OWASPNZDAY2010-Defending_against_applicatio ...
随机推荐
- Linux基本操作及常用指令
今天复习了下Linux的基本操作及常用指令,上学期大数据云计算课一直也在用linux系统还是比较熟悉的,并在centos6.7虚拟机上部署了前几天做的web项目,了解了Nginx的反向代理与负载均衡, ...
- 如何学习kafka?
本文是我学习kafka的一个思路和总结,希望对刚接触kafka的你有所帮助.在学习kafka之前,最好能对kafka有一个简单的了解,可以提出一些问题,带着问题去学习,就会容易一些. 0 什么是k ...
- ubuntu1804自带的vim和vi都是用什么版本?
之前搜索vim一些命令时,经常看到有人说ubuntu自带的vim是是vim.tiny的,功能不全. 什么需要先卸载,再重装,真的是这样吗? 我查了一下,vim的版本号 vim --version vi ...
- 雅奇880、990、小土豆调用EPX Studio 编译的DLL的编程方法~
在雅奇990中,使用“外部文件-调用链接库文件”命令实现与EP的通信,例如: 1.调用链接库文件(取项目文件信息() + '资源文件\Project1.dll', 'Unit1.rpas:Result ...
- Linux学习第六天
学习Linux环境下的挂载命令. 什么是挂载命令? 1.Windows下,mount挂载,就是给磁盘分区提供一个盘符(C,D,E,...).比如插入U盘后系统自动分配给了它I:盘符其实就是挂载,退优盘 ...
- 2. weddriver的定位方法
一. find_element_by_****的方式 首页在网页上鼠标右键选择检查并点击,查看需要定位的元素. https://www.baidu.com 以百度为例 导入模块的: from sel ...
- c# winform 访问WebServices (通过Http方式)
第一步.编写WebServices服务方法 [WebMethod] public void PostJson(string str, string bb) { Dictionary<string ...
- 关于git 远程仓库账户密码错误的问题
主要是电脑凭证把第一次输入的账户密码记录了下来,在控制面板->用户账户->凭据管理器里, 选择windows凭证, 你会找到git:凭据,直接删掉或者更改都可以! 对应的Git的凭证,删除 ...
- MySQL基础知识_1
平时只会使用简单的增删改查,促使我学习这个来源于一道面试题,左思右想,依然想不出来,所以决定系统的学习一下. MySQL创建数据库 CREATE DATABASE <数据库名>; CREA ...
- no parameterless constructor define for type 解决一例
在生成根据模型和上下文生成带增删查改操作的视图的控制器时,提示上述信息,网上查找了资料也没有解决,突然想起该项目是连接MSSQL数据库和Redis数据库的,并且已经依赖注入了,而Redis数据库的服务 ...