<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://apkqiu.oc.com.ar/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E9%A3%9F%E7%89%A9%E9%93%BE</id>
	<title>食物链 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://apkqiu.oc.com.ar/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E9%A3%9F%E7%89%A9%E9%93%BE"/>
	<link rel="alternate" type="text/html" href="https://apkqiu.oc.com.ar/mediawiki/index.php?title=%E9%A3%9F%E7%89%A9%E9%93%BE&amp;action=history"/>
	<updated>2026-10-18T02:01:02Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://apkqiu.oc.com.ar/mediawiki/index.php?title=%E9%A3%9F%E7%89%A9%E9%93%BE&amp;diff=47&amp;oldid=prev</id>
		<title>Apkqiu：​替换source为新的syntaxhighlight</title>
		<link rel="alternate" type="text/html" href="https://apkqiu.oc.com.ar/mediawiki/index.php?title=%E9%A3%9F%E7%89%A9%E9%93%BE&amp;diff=47&amp;oldid=prev"/>
		<updated>2026-08-19T12:09:50Z</updated>

		<summary type="html">&lt;p&gt;替换source为新的syntaxhighlight&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年8月19日 (三) 12:09的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l36&quot;&gt;第36行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第36行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;所以我们的绝招是：&amp;#039;&amp;#039;&amp;#039;在找族长的时候，顺手把沿途所有人的老爸直接改成族长&amp;#039;&amp;#039;&amp;#039;。下次再找，一步到位！&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;所以我们的绝招是：&amp;#039;&amp;#039;&amp;#039;在找族长的时候，顺手把沿途所有人的老爸直接改成族长&amp;#039;&amp;#039;&amp;#039;。下次再找，一步到位！&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source &lt;/del&gt;lang=&quot;c++&quot; line=&quot;1&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight &lt;/ins&gt;lang=&quot;c++&quot; line=&quot;1&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;int find(int x) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;int find(int x) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (f[x] == x) return x;    // 我自己就是族长&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (f[x] == x) return x;    // 我自己就是族长&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     return f[x] = find(f[x]);   // 路径压缩：直接把老爸改成族长&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     return f[x] = find(f[x]);   // 路径压缩：直接把老爸改成族长&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;2. 合并圈子（Union）——加上“按秩合并”&amp;#039;&amp;#039;&amp;#039;  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;2. 合并圈子（Union）——加上“按秩合并”&amp;#039;&amp;#039;&amp;#039;  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l49&quot;&gt;第49行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第49行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;所以我们记录每棵树的高度（rank），&amp;#039;&amp;#039;&amp;#039;总是把矮的树挂到高的树下面&amp;#039;&amp;#039;&amp;#039;，这样树的高度增长最慢，整体更扁平。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;所以我们记录每棵树的高度（rank），&amp;#039;&amp;#039;&amp;#039;总是把矮的树挂到高的树下面&amp;#039;&amp;#039;&amp;#039;，这样树的高度增长最慢，整体更扁平。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source &lt;/del&gt;lang=&quot;c++&quot; line=&quot;1&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight &lt;/ins&gt;lang=&quot;c++&quot; line=&quot;1&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;void union(int a, int b) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;void union(int a, int b) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     int ra = find(a), rb = find(b);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     int ra = find(a), rb = find(b);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l57&quot;&gt;第57行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第57行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (rank[ra] == rank[rb]) rank[ra]++;  // 高度一样时，新高度+1&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (rank[ra] == rank[rb]) rank[ra]++;  // 高度一样时，新高度+1&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;有了路径压缩和按秩合并，并查集的速度就快到飞起（几乎是常数时间 O(α(N))），处理几万只动物绰绰有余。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;有了路径压缩和按秩合并，并查集的速度就快到飞起（几乎是常数时间 O(α(N))），处理几万只动物绰绰有余。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l77&quot;&gt;第77行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第77行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;在找族长（根节点）的路上，我们要把沿途的权值累加起来，这样就能知道&amp;#039;&amp;#039;&amp;#039;我和族长是什么关系&amp;#039;&amp;#039;&amp;#039;。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;在找族长（根节点）的路上，我们要把沿途的权值累加起来，这样就能知道&amp;#039;&amp;#039;&amp;#039;我和族长是什么关系&amp;#039;&amp;#039;&amp;#039;。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source &lt;/del&gt;lang=&quot;c++&quot; line=&quot;1&quot;&amp;gt;int find(int x) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight &lt;/ins&gt;lang=&quot;c++&quot; line=&quot;1&quot;&amp;gt;int find(int x) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (f[x] == x) return x;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (f[x] == x) return x;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     int fa = f[x];           // 记下老爸&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     int fa = f[x];           // 记下老爸&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l83&quot;&gt;第83行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第83行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     dis[x] = (dis[x] + dis[fa]) % 3; // 累加关系：我到老爸 + 老爸到爷爷&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     dis[x] = (dis[x] + dis[fa]) % 3; // 累加关系：我到老爸 + 老爸到爷爷&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     return f[x] = root;      // 路径压缩，挂到族长下面&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     return f[x] = root;      // 路径压缩，挂到族长下面&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 带权并查集的“并”（Union）——最精彩的公式推导 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 带权并查集的“并”（Union）——最精彩的公式推导 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l133&quot;&gt;第133行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第133行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;最后，我们带着满满的成就感，再看一遍参考答案：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;最后，我们带着满满的成就感，再看一遍参考答案：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source &lt;/del&gt;lang=&quot;cpp&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight &lt;/ins&gt;lang=&quot;cpp&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#include &amp;lt;bits/stdc++.h&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#include &amp;lt;bits/stdc++.h&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#define MAXN 50005&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#define MAXN 50005&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l189&quot;&gt;第189行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第189行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   return 0;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   return 0;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* f 数组是“家族树”的骨架。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* f 数组是“家族树”的骨架。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Apkqiu</name></author>
	</entry>
	<entry>
		<id>https://apkqiu.oc.com.ar/mediawiki/index.php?title=%E9%A3%9F%E7%89%A9%E9%93%BE&amp;diff=39&amp;oldid=prev</id>
		<title>Apkqiu：​创建页面，内容为“老虎、狗和马，它们之间有个奇怪的“循环吃法”：&lt;blockquote&gt;老虎吃狗，狗吃马，马吃老虎。&lt;/blockquote&gt;现在，森林里来了一个“神秘法官”，他把 N 只动物（编号 1~N）关在小黑屋里，你只能透过门缝听，完全看不到谁是谁。法官开始念“内部情报”：  * 情报一：&lt;code&gt;1 X Y&lt;/code&gt; —— 意思是“X 和 Y 是同一个物种”（比如都是老虎）。 * 情报二：&lt;code&gt;2…”</title>
		<link rel="alternate" type="text/html" href="https://apkqiu.oc.com.ar/mediawiki/index.php?title=%E9%A3%9F%E7%89%A9%E9%93%BE&amp;diff=39&amp;oldid=prev"/>
		<updated>2026-08-19T09:53:55Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“老虎、狗和马，它们之间有个奇怪的“循环吃法”：&amp;lt;blockquote&amp;gt;老虎吃狗，狗吃马，马吃老虎。&amp;lt;/blockquote&amp;gt;现在，森林里来了一个“神秘法官”，他把 N 只动物（编号 1~N）关在小黑屋里，你只能透过门缝听，完全看不到谁是谁。法官开始念“内部情报”：  * 情报一：&amp;lt;code&amp;gt;1 X Y&amp;lt;/code&amp;gt; —— 意思是“X 和 Y 是同一个物种”（比如都是老虎）。 * 情报二：&amp;lt;code&amp;gt;2…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;老虎、狗和马，它们之间有个奇怪的“循环吃法”：&amp;lt;blockquote&amp;gt;老虎吃狗，狗吃马，马吃老虎。&amp;lt;/blockquote&amp;gt;现在，森林里来了一个“神秘法官”，他把 N 只动物（编号 1~N）关在小黑屋里，你只能透过门缝听，完全看不到谁是谁。法官开始念“内部情报”：&lt;br /&gt;
&lt;br /&gt;
* 情报一：&amp;lt;code&amp;gt;1 X Y&amp;lt;/code&amp;gt; —— 意思是“X 和 Y 是同一个物种”（比如都是老虎）。&lt;br /&gt;
* 情报二：&amp;lt;code&amp;gt;2 X Y&amp;lt;/code&amp;gt; —— 意思是“X 能吃掉 Y”。&lt;br /&gt;
&lt;br /&gt;
你的任务就是当“鉴谎官”：每听到一句话，就判断它是否和前面已经确认的情报&amp;#039;&amp;#039;&amp;#039;逻辑矛盾&amp;#039;&amp;#039;&amp;#039;，要是矛盾，这就是假话。最后统计一共听到了多少句假话。&lt;br /&gt;
&lt;br /&gt;
== 为什么我们不能直接“看答案”？ ==&lt;br /&gt;
&lt;br /&gt;
你肯定想：“把门打开看看它是老虎还是狗不就行了？”&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;关键就在这里：&amp;#039;&amp;#039;&amp;#039;法官永远不让你开门，而且他给的情报特别少！  &lt;br /&gt;
比如他说“1号吃2号，2号吃3号”，虽然不知道 1、2、3 具体是谁，但我们能铁定推出“3号一定吃1号”（因为老虎→狗→马→老虎，循环了）。这时候如果法官补一句“1号和3号是同类”，那肯定是假话——因为我们用逻辑推导出它俩是“食物链上下游”，绝不可能是同类。&lt;br /&gt;
&lt;br /&gt;
所以，我们的核心思路不是去猜“1号是老虎还是狗”，而是&amp;#039;&amp;#039;&amp;#039;只维护动物之间两两的“相对关系”&amp;#039;&amp;#039;&amp;#039;：是同类？还是甲吃乙？&lt;br /&gt;
&lt;br /&gt;
== 第一关：先忘掉“吃”，只谈“同类” ==&lt;br /&gt;
&lt;br /&gt;
假设所有情报都是“X和Y是同类”，那问题就简单多了：就像在交朋友，A和B是朋友，B和C是朋友，那A和C自然也是朋友。随着情报增多，动物们会分成一个个“朋友圈”。&lt;br /&gt;
&lt;br /&gt;
这时候，我们需要一个&amp;#039;&amp;#039;&amp;#039;超级小本本&amp;#039;&amp;#039;&amp;#039;，它能快速做到两件事：&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;查&amp;#039;&amp;#039;&amp;#039;（Find）：任意两只动物，查一查它们在不在同一个朋友圈？&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;并&amp;#039;&amp;#039;&amp;#039;（Union）：如果不在同一个朋友圈，怎么把这两个圈子快速合并成一个？&lt;br /&gt;
&lt;br /&gt;
这个“超级小本本”，就是算法界大名鼎鼎的&amp;#039;&amp;#039;&amp;#039;并查集（Union-Find）&amp;#039;&amp;#039;&amp;#039;。你可以把它想象成&amp;#039;&amp;#039;&amp;#039;一棵棵“家族树”&amp;#039;&amp;#039;&amp;#039;：&lt;br /&gt;
&lt;br /&gt;
* 每个朋友圈选一个“族长”（根节点），比如 1 号是族长。&lt;br /&gt;
* 每个成员只记录自己的“老爸”是谁（父节点 f[i]）。&lt;br /&gt;
* 想找族长，就顺着老爸、老爸的老爸……一路往上爬。&lt;br /&gt;
&lt;br /&gt;
=== 并查集的核心操作 ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. 查询族长（Find）——加上“路径压缩”&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
如果一条链特别长（1是族长，2挂1，3挂2，4挂3……），找4的族长要爬三层，太慢了！  &lt;br /&gt;
所以我们的绝招是：&amp;#039;&amp;#039;&amp;#039;在找族长的时候，顺手把沿途所有人的老爸直接改成族长&amp;#039;&amp;#039;&amp;#039;。下次再找，一步到位！&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
int find(int x) {&lt;br /&gt;
    if (f[x] == x) return x;    // 我自己就是族长&lt;br /&gt;
    return f[x] = find(f[x]);   // 路径压缩：直接把老爸改成族长&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2. 合并圈子（Union）——加上“按秩合并”&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
如果两个圈子要合并，该让哪个圈子的族长当新族长呢？如果总把大树挂在小树上，树会越来越高。  &lt;br /&gt;
&lt;br /&gt;
所以我们记录每棵树的高度（rank），&amp;#039;&amp;#039;&amp;#039;总是把矮的树挂到高的树下面&amp;#039;&amp;#039;&amp;#039;，这样树的高度增长最慢，整体更扁平。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void union(int a, int b) {&lt;br /&gt;
    int ra = find(a), rb = find(b);&lt;br /&gt;
    if (ra == rb) return;&lt;br /&gt;
    if (rank[ra] &amp;lt; rank[rb]) swap(ra, rb); // 让ra当新族长&lt;br /&gt;
    f[rb] = ra;                             // rb挂到ra下面&lt;br /&gt;
    if (rank[ra] == rank[rb]) rank[ra]++;  // 高度一样时，新高度+1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
有了路径压缩和按秩合并，并查集的速度就快到飞起（几乎是常数时间 O(α(N))），处理几万只动物绰绰有余。&lt;br /&gt;
&lt;br /&gt;
== 第二关：加入“吃”的关系——带上“权值”的小本本 ==&lt;br /&gt;
&lt;br /&gt;
现在问题升级了，圈子里不仅有“同类”，还有“上级”和“下级”（吃与被吃）。普通并查集只记录“连不连”，现在我们要记录&amp;#039;&amp;#039;&amp;#039;“连着的这条线是什么关系”&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
于是，我们给并查集的每条边贴上一个&amp;#039;&amp;#039;&amp;#039;标签（权值）dis[i]&amp;#039;&amp;#039;&amp;#039;，表示 i 和它的老爸 f[i] 之间的关系。我们用数字 0、1、2 来定义：&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;：我和老爸是同类。&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;：&amp;#039;&amp;#039;&amp;#039;老爸吃我&amp;#039;&amp;#039;&amp;#039;。（重点！代码里就是这么定义的，记牢它）&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039;：&amp;#039;&amp;#039;&amp;#039;我吃老爸&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
为什么要用 0、1、2？因为三种关系首尾相连（0→同类，1→老爸吃我，2→我吃老爸），正好可以用&amp;#039;&amp;#039;&amp;#039;模 3（%3）加法&amp;#039;&amp;#039;&amp;#039;来传递。比如：如果老爸吃我（1），老爸的老爸吃老爸（1），那我到爷爷的关系就是 (1+1)%3 = 2，表示我吃爷爷。完美契合循环食物链！&lt;br /&gt;
&lt;br /&gt;
=== 带权并查集的“查”（Find）——边压缩边算账 ===&lt;br /&gt;
&lt;br /&gt;
在找族长（根节点）的路上，我们要把沿途的权值累加起来，这样就能知道&amp;#039;&amp;#039;&amp;#039;我和族长是什么关系&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;int find(int x) {&lt;br /&gt;
    if (f[x] == x) return x;&lt;br /&gt;
    int fa = f[x];           // 记下老爸&lt;br /&gt;
    int root = find(fa);     // 递归找到族长（同时更新了dis[fa]）&lt;br /&gt;
    dis[x] = (dis[x] + dis[fa]) % 3; // 累加关系：我到老爸 + 老爸到爷爷&lt;br /&gt;
    return f[x] = root;      // 路径压缩，挂到族长下面&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 带权并查集的“并”（Union）——最精彩的公式推导 ===&lt;br /&gt;
&lt;br /&gt;
现在，我们听到一句新情报：“X 和 Y 的关系是 d”（d=0 代表同类，d=1 代表 X 吃 Y）。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;第一步：找族长&amp;#039;&amp;#039;&amp;#039;  找到 X 的族长 fx，Y 的族长 fy。  &lt;br /&gt;
如果 fx == fy，说明它们已经在同一本账上了，我们直接算一下 X 和 Y 的实际关系，跟 d 比对，对不上就是假话（后面细说）。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;第二步：合并账本&amp;#039;&amp;#039;&amp;#039;  如果 fx != fy，说明这句话不矛盾，是真的。我们要把两本账合并。假设我们把 fy 这棵树的族长，&amp;#039;&amp;#039;&amp;#039;挂到 fx 下面&amp;#039;&amp;#039;&amp;#039;（即 f[fy] = fx）。&lt;br /&gt;
&lt;br /&gt;
现在最关键的问题来了：&amp;#039;&amp;#039;&amp;#039;新挂上去的这条边，标签 dis[fy] 应该填几？&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
我们来解这个“模 3 方程”：&lt;br /&gt;
&lt;br /&gt;
* 已知 dis[x] 表示 &amp;#039;&amp;#039;&amp;#039;X 和老爸 fx 的关系&amp;#039;&amp;#039;&amp;#039;（老爸吃我？还是我吃老爸？）。&lt;br /&gt;
* 已知 dis[y] 表示 &amp;#039;&amp;#039;&amp;#039;Y 和老爸 fy 的关系&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
* 设 dis[fy] = w，表示 &amp;#039;&amp;#039;&amp;#039;fy 和它新老爸 fx 的关系&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
我们要让合并后，X 和 Y 的关系正好等于 d（d=1 时 X 吃 Y）。&lt;br /&gt;
&lt;br /&gt;
根据我们的定义，&amp;#039;&amp;#039;&amp;#039;任意两个动物 a 和 b 的关系（a 吃 b 则值为1）&amp;#039;&amp;#039;&amp;#039;，可以用公式计算：&amp;lt;code&amp;gt;a 到 b 的关系 = (dis[b] - dis[a] + 3) % 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所以，X 到 Y 的关系等于：&amp;lt;code&amp;gt;(dis[y] 到 fx的关系 - dis[x] + 3) % 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
而 Y 到 fx 的关系，就是 Y 先到 fy，再从 fy 到 fx：&lt;br /&gt;
&amp;lt;code&amp;gt;(dis[y] + dis[fy]) % 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
代入得到：&lt;br /&gt;
&amp;lt;code&amp;gt;((dis[y] + w) - dis[x]) % 3 = d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解这个方程（把 w 挪到一边）：&lt;br /&gt;
&amp;lt;code&amp;gt;w = (dis[x] - dis[y] + d + 3) % 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;看！这就是参考答案里那行公式 &amp;lt;code&amp;gt;dis[fb] = (3 + dis[a] - dis[b] + d) % 3&amp;lt;/code&amp;gt; 的由来！&amp;#039;&amp;#039;&amp;#039; 它完全不是凭空出现的，而是逻辑推导的必然结果。&lt;br /&gt;
&lt;br /&gt;
== 第三关：如何当场判定假话？ ==&lt;br /&gt;
每次听到一句话，我们按以下顺序排查：&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;硬伤&amp;#039;&amp;#039;&amp;#039;：如果 X 或 Y 编号大于 N 或者小于等于 0，直接算假话（范围外不存在）。&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;自己吃自己&amp;#039;&amp;#039;&amp;#039;：如果 op == 2 且 X == Y，直接算假话（动物不能自己吃自己，但自己和自己同类是真话）。&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;逻辑冲突&amp;#039;&amp;#039;&amp;#039;（已经在同一个集合中）：&lt;br /&gt;
   * 如果是“同类”（op=1）：检查 dis[x] 是否等于 dis[y]。如果不等，说明它们对族长的关系不同，不可能是同类，假话！&lt;br /&gt;
   * 如果是“X吃Y”（op=2）：计算 X 到 Y 的实际关系 (dis[y] - dis[x] + 3) % 3，看它是否等于 1。如果不等于 1，假话！&lt;br /&gt;
&lt;br /&gt;
如果以上都没问题，这句话就是真话，执行 merge 操作，把两个集合连起来。&lt;br /&gt;
== 回头看看代码，是不是全懂了？ ==&lt;br /&gt;
&lt;br /&gt;
最后，我们带着满满的成就感，再看一遍参考答案：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
#define MAXN 50005&lt;br /&gt;
using namespace std;&lt;br /&gt;
int n, k, f[MAXN], dis[MAXN], x, y, op, ans;&lt;br /&gt;
int find(int x)&lt;br /&gt;
{&lt;br /&gt;
  if (f[x] == x)&lt;br /&gt;
    return x;&lt;br /&gt;
  int fa = find(f[x]);&lt;br /&gt;
  dis[x] = (dis[x] + dis[f[x]]) % 3;&lt;br /&gt;
  return f[x] = fa;&lt;br /&gt;
}&lt;br /&gt;
void merge(int d, int a, int b)&lt;br /&gt;
{&lt;br /&gt;
  int fa = find(a), fb = find(b);&lt;br /&gt;
  if (fa == fb)&lt;br /&gt;
    return;&lt;br /&gt;
  dis[fb] = (3 + dis[a] - dis[b] + d) % 3;&lt;br /&gt;
  f[fb] = fa;&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
#ifndef ONLINE_JUDGE&lt;br /&gt;
  freopen(&amp;quot;data/data1.in&amp;quot;, &amp;quot;r&amp;quot;, stdin);&lt;br /&gt;
// freopen(&amp;quot;data/data1.out&amp;quot;, &amp;quot;w&amp;quot;, stdout);&lt;br /&gt;
#endif&lt;br /&gt;
  scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;k);&lt;br /&gt;
  for (int i = 1; i &amp;lt;= n; i++)&lt;br /&gt;
    f[i] = i;&lt;br /&gt;
  while (k--)&lt;br /&gt;
  {&lt;br /&gt;
    scanf(&amp;quot;%d%d%d&amp;quot;, &amp;amp;op, &amp;amp;x, &amp;amp;y);&lt;br /&gt;
    if (x &amp;gt; n || x &amp;lt;= 0 || y &amp;gt; n || y &amp;lt;= 0)&lt;br /&gt;
    {&lt;br /&gt;
      ans++;&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
    if (op == 1)&lt;br /&gt;
    {&lt;br /&gt;
      if (find(x) == find(y))&lt;br /&gt;
        ans += dis[x] != dis[y];&lt;br /&gt;
      else&lt;br /&gt;
        merge(op - 1, x, y);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if (find(x) == find(y))&lt;br /&gt;
        ans += (dis[y] - dis[x] + 3) % 3 != 1;&lt;br /&gt;
      else&lt;br /&gt;
        merge(op - 1, x, y);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;%d&amp;quot;, ans);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* f 数组是“家族树”的骨架。&lt;br /&gt;
* dis 数组是“家族树”边上的关系标签。&lt;br /&gt;
* find 函数里的递归，是在“寻根问祖”的同时“清理门户”（路径压缩+权值更新）。&lt;br /&gt;
* merge 里的公式，是在两个陌生的家族之间，找到唯一正确的“联姻方式”。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;并查集&amp;#039;&amp;#039;&amp;#039;就像一位精明的档案管理员，用“路径压缩”让查档案快如闪电，用“按秩合并”让档案柜永远整整齐齐。而&amp;#039;&amp;#039;&amp;#039;带权并查集&amp;#039;&amp;#039;&amp;#039;，则是给每份档案贴上了“关系标签”，让老虎、狗、马之间的恩恩怨怨，都在 0、1、2 的模 3 运算中灰飞烟灭。&lt;br /&gt;
&lt;br /&gt;
现在，打开你的编辑器，亲手敲一遍吧。当代码跑出正确答案的那一刻，你收获的不仅仅是一道题的通过，更是一种将“复杂关系”抽象成“数学运算”的神奇思维。&lt;/div&gt;</summary>
		<author><name>Apkqiu</name></author>
	</entry>
</feed>