传送门 \(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维护凸包比较简单.一条直线插入时,先判断这条线段在当前凸包中是否合法,然后不断把两边不合法的直线删去.…
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 啥的可以搞,可惜不大会. 这里就引入了一种科技,…
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…
听说正解是啥 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\)…
[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维护凸包,到时候自底向上做一次启发式合并就行了(也可以线段树合并).…
题面 题目背景 因为出题人天天被 ZZH(Zou ZHen) 吊打,所以这场比赛的题目中出现了 ZZH . 简要题面 数据范围 题解 (笔者写两个log的平衡树和启发式合并卡过的,不足为奇) 首先,很容易看出来n^2的做法是个树形DP,而且不是换根DP(笔者想换根DP想了半小时,发现题读难了,唉), 设 dp[i] 为从 i 出发的答案,容易想到这样的状态转移: (depth是从1到每个点的距离,即深度,ancestors是每个点的祖先集) 怎么办,j 好像要在 i 的子树中枚举? 但是这个式子…
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…
题意 给你一棵 \(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\…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 个点的树(标号1~n),以结点 1 为根.每个结点有两个点权 ai 与 bi. 你可以从一个点出发跳到它的子树中的某个结点去(不能跳到自己). 从 x 跳到 y 所花费的代价为 ax * by,跳跃的总代价为每次跳跃的代价之和. 对于每个结点,计算从它出发跳到某一叶子结点的最小代价和. Input 第一行包含一个整数 n (2 ≤ n ≤ 10^5…
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数表示 N个节点上的权值.  接下来 M行,每行包含两个整数x和 y,表示初始的时候,点x和点y 之间有一条无向边, 接下来 T行,每行描述一个操作,格式为“Q x y k”或者“L x y ”,其含义见题目描述部分. Output 对于每一个第一类操作,输出一个非负整数表示答…