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 ...
随机推荐
- html5插件完成滚屏幕效果
首先想要完成这样的效果要用到jquery-fullpage插件我们需要他的js文件和css样式文件如图 因为是jquery的插件所以我们还要导入jquery-min.js 在页面引入这些样式和插件 ...
- 随着php7的发布我个人觉得有必要进行一下历史回顾和整理
先看下人尽皆知的发展历史: HP 继承自一个老的工程,名叫 PHP/FI.PHP/FI 在 1995 年由 Rasmus Lerdorf 创建,最初只是一套简单的 Perl 脚本,用来跟踪访问他主页的 ...
- Golang package轻量级KV数据缓存——go-cache源码分析
作者:Moon-Light-Dream 出处:https://www.cnblogs.com/Moon-Light-Dream/ 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须在文章中给出原文 ...
- 【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)
目录 视频讲解: 一.数组的概述 二.一维数组的使用 三.Arrays工具类中的sort方法(sort方法用的多,我们具体讲一下) 四.数组中的常见异常 五.一维数组练习题 六.彩蛋(本期视频使用的P ...
- Asp.Net Core 2.0实现HttpResponse中繁切换
随笔背景:因为项目中有个简单的功能是需要实现中文简体到繁体的切换,数据库中存储的源数据都是中文简体的,为了省事就想着通过HttpHeader的方式来控制Api返回对应的繁体数据. 实现方式:通过Asp ...
- numpy——>数组拼接np.concatenate
语法:np.concatenate((a1, a2, ...), axis=0) 1.默认是 axis = 0,也就是说对0轴(行方向)的数组对象,进行其垂直方向(axis=1)的拼接(即数据整行整行 ...
- C++ 深拷贝和浅拷贝详解
前言 在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数. 位拷贝( ...
- [组件封装]微信小程序-图片批量上传照片墙
描述 批量上传图片, 可设置最大上传个数, 可删除, 可设置默认值. 效果 源码 pictures-wall.wxml <view class="picturesWall"& ...
- 详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第13篇文章,我们来看下Kmeans算法的优化. 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我 ...
- rbac权限+中间件 初识
rbac权限+中间件 1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or ...