Codeforce 500 D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

今天我們來看看CF500D

題目連結

題目

給你一棵有邊權的樹,求現在隨機取\(3\)點,求這三點互相距離總和的期望值。

前言

今天寫的題目都是看解答就會寫,原本就沒有的自信心又要更低了

想法

\(3\)個點要考慮的事情太多了,首先只要注意到以下一件事,那麼其他的事情就和CF1401D沒兩樣了。

注意到(\(E(X)\)代表\(X\)事件的期望值):\(E(d(c_1,c_2)+d(c_2,c_3)+d(c_1,c_3))=E(d(c_1,c_2))+E(d(c_2,c_3))+E(d(c_1,c_3))\)

且\(c_1,c_2,c_3\)都是\(dummy\ variable\),所以\(E(d(c_1,c_2))=E(d(c_2,c_3))=E(d(c_1,c_3))\)

也就是說我們只要能算出隨便取兩點的距離期望值,那麼最後答案\(\times3\)就好。

(以下內容可以參照CF1401D)

那麼我們只要算出如果所有點對的距離都被算一次,每個邊會被算幾次就好。

維護每個子樹有幾個點為\(cnt[v]\),接著枚舉邊\(\{u,v,w\}\),保證\(dep[u]<dep[v]\),這個邊會被走過的次數就是這條邊連接的兩個點集的點的數量的相乘,也就是\(cnt[v]\times(n-cnt[v])\)。把邊權總和儲存到一個\(long\ long\)裡,由於邊權總和至多是\(n\times n^2\times1000=10^{18}\)(1000是一條邊的最大邊權),所以儲存沒有問題。

每次修改邊就單純的把這條邊的貢獻重算一遍就好。

程式碼:

const int _n=1e5+10;
int t,n,a,b,l,q,r,w,fa[_n],cnt[_n],dep[_n];
ll sum;
vector<PII> G[_n];
struct E{int u,v,w;} e[_n];
ll C(ll x){if(x<2ll)return 0;return x*(x-1)/2ll;}
void dfs(int v,int faa,int d){
fa[v]=faa,dep[v]=d,cnt[v]=1;
rep(i,0,SZ(G[v]))if(G[v][i].fi!=faa)
dfs(G[v][i].fi,v,d+1),cnt[v]+=cnt[G[v][i].fi];
}
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;rep(i,1,n){cin>>a>>b>>l;a--,b--;G[a].pb({b,l}),G[b].pb({a,l});e[i]={a,b,l};}
dfs(0,-1,0);rep(i,1,n){
int u=e[i].u,v=e[i].v,w=e[i].w;
if(dep[u]>dep[v])swap(u,v);
sum+=1ll*cnt[v]*(n-cnt[v])*w;
}
cin>>q;while(q--){
cin>>r>>w;int u=e[r].u,v=e[r].v;
if(dep[u]>dep[v])swap(u,v);
sum-=1ll*cnt[v]*(n-cnt[v])*e[r].w;
sum+=1ll*cnt[v]*(n-cnt[v])*w;
cout<<setprecision(20)<<3.0*sum/(1.0*C(n))<<'\n';
e[r].w=w;
}
return 0;
}

標頭、模板請點Submission看

Submission

D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)的更多相关文章

  1. D. Rescue Nibel! 解析(思維、組合、離散化、差分)

    Codeforce 1420 D. Rescue Nibel! 解析(思維.組合.離散化.差分) 今天我們來看看CF1420D 題目連結 題目 給你\(n\)個區間,求有幾種方法使得\(k\)個區間的 ...

  2. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  3. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  4. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  5. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  6. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  7. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

  8. D. Road to Post Office 解析(思維)

    Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...

  9. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

随机推荐

  1. 初学源码之——银行案例手写IOC和AOP

    手写实现lOC和AOP 上一部分我们理解了loC和AOP思想,我们先不考虑Spring是如何实现这两个思想的,此处准备了一个『银行转账」的案例,请分析该案例在代码层次有什么问题?分析之后使用我们已有知 ...

  2. Quartz.NET集成UI版

    Quartz.NET Quartz.NET是NET的开源作业调度系统. Quartz.NET是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统. Quartz.NET目前支持NET ...

  3. Oracle 11gR2

    OracleOraDb11g_home1TNSListener #其它客服端连接需要开启服务,如不开启,本机连接可以直接使用sqlplus OracleServiceORCL #实例SID服务  sq ...

  4. Python练习题 045:Project Euler 017:数字英文表达的字符数累加

    本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...

  5. 商品现货数据不好拿?商品季节性难跟踪?一键解决没烦恼的Python爬虫分享

    更多精彩内容,欢迎关注公众号:数量技术宅.探讨数据分析.量化投资问题,请加技术宅微信:sljsz01 季节性在大宗商品的交易中至关重要 大宗商品交易中,特别是在期货市场,由于商品价格周期的存在,季节性 ...

  6. P2947 Look Up S

    题目描述: 约翰的N(1≤N≤10^5)头奶牛站成一排,奶牛i的身高是Hi(l≤Hi≤1,000,000).现在,每只奶牛都在向右看齐.对于奶牛i,如果奶牛j满足i<j且Hi<Hj,我们可 ...

  7. 请编写sql多语句表值函数统,计指定年份中每本书的销售总额

    create table 图书表( 书号 varchar(50), 书名 varchar(50), 单价 int ) create table 销售表( 书号 varchar(50), 销售时间 da ...

  8. 【题解】CF1426D Non-zero Segments

    题目戳我 \(\text{Solution:}\) 若\([l,r]\)子段和是\(0,\)则\(sum[r]=sum[l-1].\) 于是我们可以考虑维护当前哪一个前缀和出现过.对于区间\([l,r ...

  9. 「剑指offer」27道Mybatis面试题含解析

    1.什么是Mybatis? Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement等繁杂 ...

  10. python自动化实现验证码登录过程

    (自动化实现验证码登录,这里内容是入坑后,整合了几个文档的内容)|以下模块是使用时需要用到的首先:安装pillow库,它的作用是对图片进行简单的处理,在pytharm中使用pip install pi ...