給定一棵 \(n\) 個節點的樹,每條邊的長度為 \(1\),同時有乙個權值\(w\)。定義一條路徑的權值為路徑上所有邊的權值的最大公約數。現在對於任意 \(i \in [1,n]\), 求樹上所有長度為 \(i\) 的簡單路徑中權值最大的是多少。如果不存在長度為 \(i\) 的路徑,則第 \(i\) 行輸出 \(0\)。
第一行,乙個整數 \(n\),表示樹的大小。
接下來 \(n-1\) 行,每行三個整數 \(u,v,w\),表示 \(u,v\) 間存在一條權值為 \(w\) 的邊。
對於每種長度,輸出一行,表示答案。
對於 \(30\%\)的資料, \(n \le 1000\)。
對於額外 \(30\%\)的資料, \(w \le 100\)。
對於 \(100\%\)的資料, \(n \le 4 \times 10^5\), \(1 \le u,v \le n\), \(w \le 10^6\)。
蜜汁題目。
思路:列舉每個可能的\(w\),建部分圖。
連邊要注意一下列舉的方法,不要用memset,像cdq分治一樣撤銷。
約數個數大約是\(n^}\)的
複雜度同階
code:
#include #include const int n=4e5+10;
const int m=1e6+10;
int head[n],to[n<<1],next[n<<1],sta[n<<1],cnt;
void add(int u,int v)
struct nodet;
int n,m,mxl,mx,used[n],ans[n];
std::vector e[m];
int max(int x,int y)
int maxdis(int now,int fa)
}mxl=mxl>mx0+mx1?mxl:mx0+mx1;
return mx0+1;
}int main()
for(int i=1;i<=mx;i++)
{for(int j=i;j<=mx;j+=i)
for(int k=0;k2018.10.11
Block Voting 解題報告
這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...
Safebreaker 解題報告
又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...
路由 解題報告
路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...