題意:給定一棵樹,讓你對其進行染色,使得任意顏色相同的兩個點之間的路徑上存在等級更高的顏色。
思路:我們考慮點分樹的結構,點分樹上的每個節點都對應於乙個邊的集合(經過這個節點的所有邊)。
點分樹上的父子關係,一棵點分樹上任意乙個節點,以他為根的子樹上的所有點是這個節點路徑集合的端點集合。
有了這些結論,這道題就變成了對點分樹進行染色,每層都染成乙個顏色。因為點分樹的層數最多為logn,所以一定存在合法的染色方案。
#include #include#include#include#includeusing namespace std;
const int maxn = 100000 + 5;
const int maxm = 200000 + 5;
int he[maxn],ne[maxm],ver[maxm],tot;
void add( int x,int y )
int root, // 當前樹的重心
vis[maxn], // 標記點是否作為重心出現過
n, // 樹的總點數
sz[maxn],
g[maxn];
void get_sz( int x,int f )
}int find_root( int x,int f )
}g[x] = max( g[x],sz[root]-sz[x] );
if( g[x] < minx ) re = x;
return re;
}void get_root( int& x )
int ans[maxn];
void dfs_div( int x,int c )
}void init(int n)
int main()
dfs_div(1,0);
for( int i = 1;i <= n;i++ )
puts("");
return 0;
}
codeforces 321 B 排序 二分
題意 n個人,每個人有money和friendship,求最大的friendship和,要求所選的人money之差小於d 思路 先按money排序,然後掃一遍,兩個指標l,r記錄當前二分範圍,prem記錄當前所選人中最小的money。注意 如果二分找到k,a i m d a k m,當前t就等於a ...
Codeforces 587C 樹上倍增
題意 求樹上兩點路徑中的前 a 10 小的點權值。思路 類似lca倍增演算法來儲存 i 2 j 路上的 前 10 小個 的點權值。然後要寫乙個權值合併 具體求 u v 的話,就是先分別計算 和 減1是lca會重疊 然後再合併,輸出答案。include include include include ...
Codeforces 976C 題解報告
對資料進行排序 1 按左邊的數從小到大排 2 若左邊的數相等,則按右邊的數從大到小排。排序之後,若乙個數的右邊的數小於等於上乙個數的右邊的數,則這兩個數必然符合題意。比如2 13 2 12 1 11排序之後,變為 1 11 2 13 2 12因為12 13,則有 2,12 被包含在它的上乙個數 2,...