\(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 解釋 從右向左讀,...