【Luogu P3994】高速公路】的更多相关文章

Problem Background \(C\) 国拥有一张四通八达的高速公路网树,其中有 \(n\) 个城市,城市之间由一共 \(n-1\) 条高速公路连接.除了首都 \(1\) 号城市,每个城市都有一家本地的客运公司,可以发车前往全国各地,有若干条高速公路连向其他城市,这是一个树型结构,\(1\) 号城市(首都)为根.假设有一个人要从 \(i\) 号城市坐车出发前往 \(j\) 号城市,那么他要花费 \(P_i\)*(\(i\) 城市到 \(j\) 城市的距离)\(+Q_i\) 元.由于距离…
https://www.luogu.org/problemnew/show/P3994 设dp[i] 表示第i个城市到根节点的最小花费 dp[i]=min{ (dis[i]-dis[j])*P[i]+Q[i]+dp[j] } 这是O(n^2)的 这个式子可以斜率优化 dp[i]+dis[j]*P[i]=dis[i]*P[i]+Q[i]+dp[j] 就是一条斜率为P[i]的直线,截(dis[j],dp[j])的最小截距 在根往下走的过程中,斜率单调递增 这就体现了 为什么题目中说“i号城市是j号城…
$ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车前往全国各地,有若干条高速公路连向其他城市,这是一个树型结构,1号城市(首都)为根.假设有一个人要从i号城市坐车出发前往j号城市,那么他要花费Pi*(i城市到j城市的距离)+Qi元.由于距离首都越远,国家的监管就越松,所以距离首都越远,客运公司的Pi(单位距离价格)越大,形式化的说,如果把高速路网看…
题目链接 题意:给出一棵树,\(1\) 号点为根,边上有边权. 每个点有两个参数 \(p_i,q_i\) 如果你想从 \(i\) 号点到与其距离为 \(d\) 的 \(j\) 号点,那么你需花费 \(d \times p_i+q_i\). 对于每个 \(i \in [2,n]\),求出:假设你站在 \(i\) 号点,到达 \(1\) 号点的最小花费. \(1 \leq n \leq 10^6\) 树上斜率优化 dfs 求出 \(i\) 到根节点的路径长度为 \(d_i\). 朴素的 \(dp\)…
题目链接 题意分析 这是一道树上斜率优化题 首先 \[dp[i]=min\{dp[j]+(dis[i]-dis[j])* p[i]+q[i]\}(j∈Pre_i)\] 那么就是 \[p[i]=\frac{dp[i]-dp[j]}{dis[i]-dis[j]}\] 我们根据\(p[i]\)递增可知 我们需要使用单调队列维护下凸包 但是由于是树 所以我们不可以进行一般的单调队列维护 所以这里我们只好进行暴力二分出最优的位置了 毕竟单调队列实现起来不是真正的删除 而是头尾指针的移动 以及唯一的取代 然…
[Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+1)(r-i)\) //\((i-l+1)(r-i)\)是每个数用到的次数 \(=\sum w_{i}((r-lr)+(l+r-1)i-i^{2})\) \(=(r-lr)\sum w_{i}+(l+r-1)\sum i\times w_{i}-\sum i^{2}\times w_{i}\) 由此…
原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠容易 ,问题在于如何求上面的 我们珂以把上面的换一个形式(枚举每段路会走几次): \[\sum_{i=l}^ra[i]*(r-i+1)*(i-l+1)\] 化简一下这个式子: \[(r-l+1-r*l)*sum1+(r+l)*sum2-sum3\] 其中\(sum1=\sum_{i=l}^ra[i]…
题目链接 这题……我从一开始就想歪了qwq. 为了缅怀逝去的一小时我就把我的30分暴力思路放上来. 首先我们观察枚举的区间.假设我们要枚举的范围是1~5之间的四条路,为了方便我们把它们叫做abcd. 那么观察我们枚举的区间. a ab abc abcd b bc bcd c cd d 观察有一些区间是可以合起来的. 然后观察a出现4次,b出现6次,c出现6次,d出现4次. 是有一定规律的qwq 然后就$\frac{nm}{2}的复杂度搞搞 就三十分 正确思路是,观察一条路选不选上(设这条路左点x…
题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: \[ans=\sum_{i=l}^{r}a_i*(i-l+1)*(r-i+1)\] 把括号拆开,就成了: \[(l+r)\sum_{i=l}^{r}a_i*i-\sum_{i=l}^{r}a_i*i^2-(l-1)*(r+1)\sum_{i=l}^{r}a_i\] 线段树上维护区间\(\sum i^…
不是很难的一个题目.正确思路是统计每一条边被经过的次数,但我最初由于习惯直接先上了一个前缀和再推的式子,导致极其麻烦难以写对而且会爆\(longlong\). 推导过程请看这里. #include <bits/stdc++.h> using namespace std; const int N = 100000 + 5; #define ls (p << 1) #define rs (p << 1 | 1) #define mid ((l + r) >> 1…