計蒜客lca批註

2021-10-23 18:21:50 字數 1071 閱讀 6450

#includeusing namespace std;

const int noip=1e5+5;

int n,q,p[noip],eid;

void init()

struct edgee[noip];

void insert(int u,int v)//鏈式前向星

/*相當於我們用鍊錶來模擬邊的儲存。

結構題edge的e來裝一些分散的邊。

eid是每加一條邊都會增長的,表示當前邊的下標。(從0開始)

p[u] 表示最後乙個加入的u指向的邊在 e 中的下標。最開始的值是-1。

在加邊的時候:

void insert(int u,int v)

因此所有的邊按照加入的順序倒著形成乙個鍊錶,p[u]是頭結點,

通過e[j].next可以訪問下乙個結點。直到 -1 表示這條鍊錶已經走到了終點。

*/int f[noip][20],d[noip];//f記錄父節點,d記錄深度

void dfs(int u)

f[v][0]=u;//記錄父節點

dfs(v);

} }int lca(int x,int y)

} if (x==y)

for (int j=k;j>=0;j--)

} /*

從大到小列舉才會找到lca,即貪心的思路:讓大的先加進去

if (f[x][j]!=f[y][j])是判斷他倆目前找到的父節點是不是公共節點

,如果是,那可能是lca,也可能不是,這就不好說,

但是最後迴圈結束後因定能找到lca,這是個規律,所以

我們讓他的某父節點不是公共的才跳

*/ return f[x][0];//迴圈結束後,x和y分別是它們 lca 的兒子。

//因此它們的父節點就是 lca

}int main()

dfs(1);//注意:節點編號有1,但無0。∴dfs(0)不對

for (int j=1;(1<>q;//詢問次數

while (q--)

return 0;

}

計蒜客 2019計蒜之道D

題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...

計蒜客 解碼

蒜頭君自己發明了一種字串的編碼方式,對於只含有大小寫字母的字串,可以用數字來表示括號裡面的串連續出現的次數 數字有可能超過一位數 比如a abcd 2等價於aabcdabcd。特別地,如果數字前面沒有括號,表示緊貼數字的前面的 乙個字母 出現的次數。比如abc2表示abcc。為了降低解碼的難度,蒜頭...

計蒜客 郊遊

蒜頭君成為了計蒜客附屬幼兒園的一名老師,乙個陽光明媚的週末,蒜頭君帶領著小朋友們去野外郊遊。一共有 2n2n 個小朋友,正好是 n n 個男孩和 n n 個女孩。蒜頭君讓小朋友分組玩遊戲,每組乙個男孩和乙個女孩,但是有些女孩比較討厭某些男孩,不願意和他們分在一組,男孩覺得和誰分在一組都無所謂。你能告...