Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西
This way
题意:
现在有一棵大小为n的树,你要往边上放0~n-2这n-1个数,定义mex(u,v)表示u到v路径上的第一个未出现的自然数,定义S
问你S最大是多少。
题解:
我感觉这道题绝不止23的难度…其实这种将单点加值转换为区间加值的题目在以前的DP中也遇到过,在线段树的题目中也是经常遇到,但是这次却没有想到真实不应该。
首先需要知道的一件事情就是从0开始的值应当和之前的值的链接在一起:
比如说0和1是这样放的,那么2就有两种放法,和他们粘在一起,这样构造出来的mex会尽可能的多。
那么求答案的时候就可以往下递归求,每次可以选择放在左端或者右端,然后由于只有这条包含0~链长-1的链会产生贡献,所以我们每次只需要找两个端点,然后进行记忆化搜索就行了。
那么我们怎么计算答案
∑ 1 ≤ u < v ≤ n m e x ( u , v ) \sum\limits_{1\leq u<v\le n}mex(u,v) 1≤u<v≤n∑mex(u,v)
→ ∑ m = 1 ∑ 1 ≤ u < v ≤ n m ( m e x ( u , v ) = m ) \rightarrow \sum\limits_{m=1}\sum\limits_{1\leq u<v\le n}m(mex(u,v)=m) →m=1∑1≤u<v≤n∑m(mex(u,v)=m)
后面这个累加符号里的值的贡献是m,但是我们可以将一次加m转成m次加1,也就是值在<=m的时候都加上1,于是m的贡献最终还是m
→ ∑ m = 1 ∑ 1 ≤ u < v ≤ n 1 ( m e x ( u , v ) < = m ) \rightarrow \sum\limits_{m=1}\sum\limits_{1\leq u<v\le n}1(mex(u,v)<=m) →m=1∑1≤u<v≤n∑1(mex(u,v)<=m)
那么我们暴力地做树形DP
dp[i][j]表示点i到点j这条链的贡献
fa[i][j]表示以i为根的时候,j的父节点
siz[i][j]表示以i为根的时候,j的子树大小。
那么状态转移方程就是
dp[l][r]=siz[r][l]*siz[l][r]+max(dfs(fa[r][l],r),dfs(l,fa[l][r]));
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e3+5;
ll dp[N][N],fa[N][N],siz[N][N];
vector<int>son[N];
void finds(int rt,int x){siz[rt][x]=1;for(int ne:son[x]){if(ne==fa[rt][x])continue;fa[rt][ne]=x;finds(rt,ne);siz[rt][x]+=siz[rt][ne];}
}
ll dfs(int l,int r){if(l==r)return 0;if(~dp[l][r])return dp[l][r];return dp[l][r]=siz[r][l]*siz[l][r]+max(dfs(fa[r][l],r),dfs(l,fa[l][r]));
}
int main()
{memset(dp,-1,sizeof(dp));int n,x,y;scanf("%d",&n);for(int i=1;i<n;i++)scanf("%d%d",&x,&y),son[x].push_back(y),son[y].push_back(x);for(int i=1;i<=n;i++)finds(i,i);ll ans=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans=max(ans,dfs(i,j));printf("%lld\n",ans);return 0;
}
Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西相关推荐
- Codeforces Round #614 (Div. 2) E. Xenon's Attack on the Gangs(DP记忆化搜索+思维)
题目链接:https://codeforces.com/contest/1293/problem/E 题目大意: 给出一棵树,要求给树的每条边赋权值,使得树中所有点的 m e x ( x , y ...
- Codeforces Round #197 (Div. 2): C. Xenia and Weights(记忆化搜索)
题意: 先输入一个长度为10的01串,第i个数字为1表示你有重量为i的砝码无数个,第i个数字为0表示你没有重量为i的砝码,你需要按照以下规则在一个一开始平衡的天平上放上m个砝码 第1个砝码放在天平左边 ...
- E. Xenon's Attack on the Gangs,Codeforces Round #614 (Div. 2),树形dp
E. Xenon's Attack on the Gangs http://codeforces.com/contest/1293/problem/E On another floor of the ...
- Codeforces 1292C Xenon's Attack on the Gangs
题目链接 Codeforces 1292C Xenon's Attack on the Gangs 题目大意 给定一棵树,将 [ 0 , n − 2 ] [0,n-2] [0,n−2]内的每个整数都仅 ...
- Xenon's Attack on the Gangs Codeforces Round #614 (Div. 2)
Xenon's Attack on the Gangs 题意: 给你一棵树,将0~n-2一一赋值给n-1条边,则S最大可能取值 S = ∑ 1 ≤ u < v ≤ n m e x ( u , v ...
- Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索
D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...
- Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索
A. Berzerk 题目连接: http://codeforces.com/contest/786/problem/A Description Rick and Morty are playing ...
- Codeforces Gym 100231G Voracious Steve 记忆化搜索
Voracious Steve 题目连接: http://codeforces.com/gym/100231/attachments Description 有两个人在玩一个游戏 有一个盆子里面有n个 ...
- Codeforces 900D Unusual Sequences:记忆化搜索
题目链接:http://codeforces.com/problemset/problem/900/D 题意: 给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y ...
最新文章
- Sharepoint之升级篇
- where is argument in check callback passed by framework - SAP UI5学习笔记
- thinkphp5 判断数据是否存在_ThinkPHP 5.1 中间件中判断要访问的操作是否存在
- java文字旋转90度_菜鸟求助:在 JAVA APPLET 里如何旋转 90 度显示一个字符?
- 数商云汽车经销商管理系统解决方案:构建消费者、经销商企业功能体系
- CC呼叫中心系统源码注册机cccloud
- JS技能点--日期时间格式化
- 卡巴斯基破解版 KISV8.0.0.432 Beta 江南混混汉化特别版
- 阿里巴巴java_阿里巴巴提供自己的Java发行版
- -verbose:gc 和 -XX:+PrintGC 的区别
- 奇特的锡纸海鲜小吃:吃到嗨都不会发胖的辣卤海鲜!值得开一家哦!
- ThinkPHP5部署项目问题1
- 数据应用案例之“客户画像体系”
- 19.0 vue3 ref,reactive请求后的赋值问题以及解决方法
- Android八门神器(一):OkHttp框架源码解析 1
- 枚举算法实践3-Lucky number c++
- 项目实训(三)unity游戏场景的搭建
- BZOJ 3566: [SHOI2014]概率充电器 期望DP + 树形DP
- 从零构建u盘linux,从零开始构建自己的U盘Linux.doc
- Unity实现物体沿指定的轴向旋转