[POI2014]FarmCraft
2024-09-29 10:21:56
题目大意:
一个$n(n\le5\times10^5)$个点的树,每个点有一个权值$c_i$,从$1$出发进行欧拉遍历,每个单位时间移动一条边,记每个点$i$被访问到的时间是$t_i$,问最后$\max\{t_i+c_i\}$的最小值(点$1$算作最后访问)。
思路:
$f[i]$表示欧拉遍历以$i$为根的子树的时间,$g[i]$表示对于以点$i$为根的子树中,对于每个点$j$,$\max\{t_j+c_j\}-t_i$的最小值。
转移时考虑贪心,对于子结点$j$,$g[j]-f[j]$的值可以在遍历别的子树的过程中抵消掉,因此可以将子结点关于$g[j]-f[j]$降序排序并进行转移。最后答案即为$\max(g[1],f[1]+c_1)$。
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
int c[N],f[N],g[N];
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
inline bool cmp(const int &a,const int &b) {
return g[a]-f[a]>g[b]-f[b];
}
void dfs(const int &x,const int &par) {
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i];
if(y==par) continue;
dfs(y,x);
g[y]=std::max(g[y]+,f[y]+=);
}
std::sort(e[x].begin(),e[x].end(),cmp);
g[x]=c[x];
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i];
if(y==par) continue;
g[x]=std::max(g[x],f[x]+g[y]);
f[x]+=f[y];
}
}
int main() {
const int n=getint();
for(register int i=;i<=n;i++) c[i]=getint();
for(register int i=;i<n;i++) {
add_edge(getint(),getint());
}
dfs(,);
printf("%d\n",std::max(g[],f[]+c[]));
return ;
}
最新文章
- JS循环语句作业讲解(折纸、兔子生兔子、买东西组合)
- Egret 压缩与解压(jszip)
- [CLR via C#]9. 参数
- sublime text2 汉化
- Java 集合系列 11 hashmap 和 hashtable 的区别
- 快餐问题(dp好题)
- 在mac上搭建python环境
- 干货CentOS6.5_Nginx1.40_Php5.57_MySQL5.5.35编译安装全记录
- hibernate第二天
- AlarmManager(全局定时器/闹钟)详解
- css3部分整理
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2版本正式发布
- React Fullpage
- LInux下几种定时器的比较和使用
- (一)java异常处理的几个问题
- DevExpress v18.2新版亮点——DevExtreme篇(四)
- visual studio发布到远程服务器的IIS
- jqgrid 单击行启用行编辑,切换行保存原编辑行
- Ubuntu 14.04 安装 DevStack与遇到的的问题记录
- 23种设计模式之备忘录模式(Memento)