單車聯通大街小巷.這就是出題人沒有寫題目背景的原因.
對於一棵樹,認為每條邊長度為 \(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\)陣列,陣列的相鄰元素用乙個空格隔開。忽略行末空格和行尾回車.
221 2
117 31
21 2
031 17
31 17對於\(100\%\)的資料,\(t=5,2<=n<=100000,1<=u,v<=n\),保證給出的\(n-1\)條邊形成一棵樹17 31
對於\(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,新增以下語句來使得語法...