題解 nkoj9162 改色找根

2022-09-22 04:12:10 字數 1143 閱讀 5853

\(1\le n,m\le 2\times 10^5\)。

考慮乙個簡單直接的建圖,若將 \(a\) 顏色作為樹根需要將 \(b\) 顏色變為 \(a\),從 \(a\) 向 \(b\) 連邊。

列舉每個顏色 \(a\) 的所有點,用類似虛樹的方法找出所有 \(a\) 顏色依賴的顏色並連邊。連邊可以用倍增優化建圖。倍增優化建圖和倍增是一樣的,看**就懂了。

建圖完成後跑 tarjan,找出那些沒有入邊的強連通分量更新答案即可。

#include #include inline int min(const int x, const int y) 

struct edge e[30000005];

int head[5000005], col[5000005], fa[200005][20], f[200005][20], dep[200005], ndtot, tot;

int dfn[5000005], low[5000005], s[5000005], belong[5000005], top, cnt, scc, n, m, ans = 1e9;

bool instack[5000005];

inline void addedge(int u, int v)

std::vectorg[200005], vec[200005], tmp;

void dfs(int u)

} for (int v : g[u]) if (v != fa[u][0]) fa[v][0] = u, dfs(v);

}int lca(int u, int v)

void tarjan(int u)

if (dfn[u] == low[u]) while (s[top --] != u);

bool flag = true;

for (int v : tmp)

if (!flag) break;

} if (flag) ans = min(ans, sum - 1); }}

int main()

for (int i = 1; i <= m; ++ i) if (!dfn[i]) tarjan(i);

printf("%d", ans);

return 0;

}

NKOJ4223 彩色方塊 題解

一道關於逆序對的題目。乍一看,字母不好處理,因此以一開始方塊排列的情況作為標準從1 n標號,然後按這個編號給方塊的目標排列情況標號。如下所示 r g b g b r 1 2 3 2 3 1 若字母相同,就要使開始和目標方塊的編號差距盡量小,這樣,才能使操作次數最少 小小的貪心 如下所示 a a c ...

省選模擬9 題解

直接將 varphi i j 展開為 varphi i varphi j frac 於是可以套用莫比烏斯反演。最終的式子大概是 sum limits f t sum limits sum limits varphi i t varphi j t dis p p 然後我的思路就偏了。為了統計 dis ...

LeetCode 9 題解 回文數

判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121輸出 true 示例 2 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。示例 3 輸入 10輸出 false 解釋 從右向左讀,...