晚間測試3 B 單 single

2022-01-10 17:00:44 字數 3114 閱讀 3044

單車聯通大街小巷.這就是出題人沒有寫題目背景的原因.

對於一棵樹,認為每條邊長度為 \(1\),每個點有乙個權值\(a[i]\).\(dis(u,v)\)為點\(u\)到\(v\)的最短路徑的邊數.\(dis(u,u)=0\).對每個點求出乙個重要程度.點\(x\)的重要程度\(b[x]\)定義為其他點到這個點的距離乘上對應的點權再求和. 即:\(b[x]=a[1]*dis(1,x)+a[2]*dis(2,x)+....+a[n]*dis(n,x)\)

現在有很多樹和對應的\(a\)陣列,並求出了\(b\)陣列.不幸的是,記錄變得模糊不清了.幸運的是,樹的形態完好地儲存了下來,\(a\)陣列和\(b\)陣列至少有乙個是完好無損的,但另乙個陣列完全看不清了.

希望你求出受損的陣列.多組資料.

第一行輸入乙個\(t\),表示資料組數。接下來\(t\)組資料。

每組資料的第\(1\)行\(1\)個整數\(n\)表示樹的點數.節點從\(1\)到\(n\)編號.

接下來\(n-1\)行每行兩個整數\(u,v\)表示\(u\)和\(v\)之間有一條邊.

接下來一行乙個整數\(t\),表示接下來陣列的型別。

\(t=0\)則下一行是\(a\)陣列,\(t=1\)則下一行是\(b\)陣列。

接下來一行\(n\)個整數,表示儲存完好的那個陣列,第\(i\)個數表示\(a[i]\)或\(b[i]\)。

\(t\)行,每組資料輸出一行表示對應的\(a\)陣列或\(b\)陣列,陣列的相鄰元素用乙個空格隔開。忽略行末空格和行尾回車.

2

21 2

117 31

21 2

031 17

31 17

17 31

對於\(100\%\)的資料,\(t=5,2<=n<=100000,1<=u,v<=n\),保證給出的\(n-1\)條邊形成一棵樹

對於\(100\%\)的資料,\(t=0\)或\(t=1,1<=a[i]<=100,1<=b[i]<=10^9\),\(t=1\)時保證給出的\(b\)陣列對應唯一的乙個\(a\)陣列。

對於\(100\%\)的資料,單個輸入檔案不會包含超過\(2000000\)個整數,這段話可以理解為,你不必考慮輸入輸出對程式執行時間的影響。

對於\(100\%\)的資料,保證答案不會超過\(int\)能表示的範圍

接下來的**中描述了每個測試點的具體特徵。每個測試點的\(5\)組資料均符合**中對應的特徵。

預設 \(1\) 號節點為根節點

我們設 \(sum[i]\) 為以 \(i\) 為根的子樹中 \(a\) 陣列的和

當 \(t=0\) 時,顯然是乙個換根 \(dp\),有 \(b[now]=b[fa]+sum[1]-sum[now]-sum[now]\)

當 \(t \neq 0\) 時,如果資料範圍較小的話可以進行高斯消元

但是這道題的 \(n\) 比較大,所以我們只能推式子

由換根 \(dp\) 的式子,我們可以得到對於除\(1\)之外的任何節點都有 \(b[now]-b[fa]=sum[1]-2sum[now]\)

我們把這些式子相加,可以得到 \(x_1b[1]+x_2b[2]+...+x_nb[n]=(n-1)sum[1]-2 \sum_^nsum[now]\)

對於左邊這一堆,我們可以 \(dfs\) 求出每乙個節點對應的係數 \(x_i\),從而得到左邊的值

對於右邊的 \(\sum_^nsum[now]\),其實就是 \(b[1]\)

因為我們在換根 \(dp\) 的第乙個 \(dfs\) 時會有 \(b[1]= \sum_sum[u]+g[u]\)

其中 \(g[u]=\sum_sum[v]+g[v]\)

當遞迴到葉子節點時,會有\(g[u]=sum[u]=a[u]\)

所以\(\sum_^nsum[now]=b[1]\)

我們帶入上面的式子就可以求出 \(sum[1]\)

進行一遍 \(dfs\) 可以求出所有節點的\(sum\)值

再進行一遍 \(dfs\) 就可以求出所有節點的\(a\)值

#include#include#include#include#include#define int long long

inline int read()

while(ch>='0' && ch<='9')

return x*fh;

}const int maxn=1e6+5;

int n,head[maxn],tot=1,t;

struct asdb[maxn];

void ad(int aa,int bb)

void clr()

int zd[maxn];

int f[maxn],g[maxn],siz[maxn],sum;

void dfs1(int now,int fa)

}void dfs2(int now,int fa)

for(int i=head[now];i!=-1;i=b[i].next)

}void solve1()

dfs1(1,0);

dfs2(1,0);

for(int i=1;i<=n;i++)

printf("\n");

}int nans,ncnt,xs[maxn];

void dfs3(int now,int fa)

}void dfs4(int now,int fa)

}void dfs5(int now,int fa)

}void solve2()

siz[1]=nans-ncnt*zd[1];

siz[1]+=2*zd[1];

siz[1]/=(n-1);

dfs4(1,0);

dfs5(1,0);

for(int i=1;i<=n;i++)

printf("\n");

}signed main()

op=read();

for(int i=1;i<=n;i++)

if(op==0) else

} return 0;

}

樹莓派3b 安裝

2019獨角獸企業重金招聘python工程師標準 一 貼散熱片 背面一片,正面兩篇。二 系統安裝 1 使用sd formatter格式化sd卡 2 使用win32diskimager寫入映象 3 將樹莓派連上電視 鍵盤 電源啟動 4 設定一些引數,連上網路。三 設定 1 在首選項中rasberry ...

樹莓派3B 安裝

之前買的樹莓派3b的板子,發現密碼忘記了,死活連線不上。通過hdmi外接顯示屏,預期的桌面系統也沒有出現。可能是hdmi的一些配置引數問題吧,懶得糾結了直接重新刷系統,系統也有了一些改動。下面開始重新刷系統之路,補充一下一些填坑之路,供自己回顧。選購及安裝參考 備註一下 散熱器 樹莓派發熱還是有點嚴...

樹莓3B 安裝vim

第一步 訪問源列表裡的每個 並讀取軟體列表,然後儲存在本地電腦。sudo apt get update 第二步 安裝vim sudo apt get install vim 第三步 配置vim sudo vim etc vim vimrc 設定語法高亮顯示 1 開啟vimrc,新增以下語句來使得語法...