@codeforces - 932F@ Escape Through Leaf】的更多相关文章

目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 个点的树(标号1~n),以结点 1 为根.每个结点有两个点权 ai 与 bi. 你可以从一个点出发跳到它的子树中的某个结点去(不能跳到自己). 从 x 跳到 y 所花费的代价为 ax * by,跳跃的总代价为每次跳跃的代价之和. 对于每个结点,计算从它出发跳到某一叶子结点的最小代价和. Input 第一行包含一个整数 n (2 ≤ n ≤ 10^5…
传送门 题目大意 https://www.luogu.org/problemnew/show/CF932F 分析 我们可以从叶子向根每次插入b和ans 所以我们不难发现就是相当于插入线段 于是李超树+线段树合并即可 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype>…
F. Escape Through Leaf time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output You are given a tree with n nodes (numbered from 1 to n) rooted at node 1. Also, each node has two values associated…
[CF932F]Escape Through Leaf 题意:给你一棵n个点的树,每个点有树形ai和bi,如果x是y的祖先,则你可以从x花费$a_x\times b_y$的费用走到y(费用可以为负).对于每个点,求从这个点开始走到某个叶子节点的最小费用. $n\le 10^5,|a_i|,|b_i|\le 10^5$ 题解:用f[x]表示x的答案,显然f[x]=min{f[y]+a[x]*b[y]}是一个凸包,我们可以用set维护凸包,到时候自底向上做一次启发式合并就行了(也可以线段树合并).…
CF932F Escape Through Leaf 首先, $ O(n^2) $ dp 是很显然的,方程长这样: \[dp[u] = min\{dp[v] + a_u\times b_v\} \] 这个方程看起来就很斜率,当我们写成了斜率优化的形式大概是这样的: \[\frac{dp[v]-dp[j]}{a_v-a_j} < -b_u \] 我们想通过这个式子做就必须维护动态凸包以及凸包的合并.这个东西是很恼火的,可能用 set 和 splay 啥的可以搞,可惜不大会. 这里就引入了一种科技,…
听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 \(n\) 个点的树 , 每个节点有两个权值 \(a_i, b_i\) . 从 \(u\) 跳到 \(v\) 的代价是 \(a_u \times b_v\) . 你需要计算每个节点跳到叶子的最小代价 . \((n \le 10^5, -10^5 \le a_i, b_i \le 10^5)\) 题解 我们首先考虑一个很容易的 \(dp\) , 令 \(dp_i\) 为 \(i\)…
Escape Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 148B Description The princess is going to escape the dragon's cave, and she needs to plan it carefully. The princess runs at vp mil…
传送门 \(DP\) 设\(f_i\)表示第\(i\)个节点的答案,\(S_i\)表示\(i\)的子节点集合,那么转移方程为\(f_i = \min\limits_{j \in S_i} \{a_i \times b_j + f_j\}\) 这是一个很明显的斜率优化式子,斜率为\(b_j\),截距为\(f_j\),自变量为\(a_i\).考虑到斜率没有单调性,所以使用set维护凸包. 使用set维护凸包比较简单.一条直线插入时,先判断这条线段在当前凸包中是否合法,然后不断把两边不合法的直线删去.…
SB 题. 写出 DP 方程:\(f_i\) 表示从 \(i\) 跳的最小值. \(i\) 是叶子就是 \(0\),否则就是选个子树中的 \(v\),\(f_i=\min(f_v+a_ib_v)\). 至于优化,求出每个子树中的凸包就行了.启发式合并保证复杂度. 复杂度 \(O(n\log^2 n)\). 没错,我又用了回家路线那又臭又长的写法. #include<bits/stdc++.h> using namespace std; typedef long long ll; const i…
题意 给你一棵 \(n\) 个点的树,每个节点有两个权值 \(a_i,b_i\). 从一个点 \(u\) 可以跳到以其为根的子树内的任意一点 \(v\)(不能跳到 \(u\) 自己),代价是 \(a_u\times b_v\). 求每个点跳到任意一个叶子的最小代价. \(n\le 10^5, -10^5\le a_i,b_i\le 10^5\) 题解 暴力 考虑暴力 \(dp\),设 \(dp_i\) 表示从叶子跳到 \(i\) 号点的最小代价. 则有转移 \(dp_u = \min\{a_u\…