codeforces 321C 點分治好題

2021-09-27 04:45:15 字數 993 閱讀 6763

題意:給定一棵樹,讓你對其進行染色,使得任意顏色相同的兩個點之間的路徑上存在等級更高的顏色。

思路:我們考慮點分樹的結構,點分樹上的每個節點都對應於乙個邊的集合(經過這個節點的所有邊)。

點分樹上的父子關係,一棵點分樹上任意乙個節點,以他為根的子樹上的所有點是這個節點路徑集合的端點集合。

有了這些結論,這道題就變成了對點分樹進行染色,每層都染成乙個顏色。因為點分樹的層數最多為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,...