計蒜客 青出於藍勝於藍 dfs序 歸併樹

2021-08-16 13:01:36 字數 1473 閱讀 6164

武當派一共有 nn 人,門派內 nn 人按照武功高低進行排名,武功最高的人排名第 11,次高的人排名第 22,… 武功最低的人排名第 nn。現在我們用武功的排名來給每個人標號,除了祖師爺,每個人都有乙個**,每個人可能有多個徒弟。

我們知道,武當派人才輩出,連祖師爺的武功都只能排行到 pp。也就是說徒弟的武功是可能超過**的,所謂的青出於藍勝於藍。

請你幫忙計算每個人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒弟….)中,有多少人的武功超過了他自己。

輸入格式

輸入第一行兩個整數 n, p(1 \le n \le 100000, 1 \le p \le n)n,p(1≤n≤100000,1≤p≤n)。

接下來 n-1n−1 行,每行輸入兩個整數 u, v(1 \le u, v \le n)u,v(1≤u,v≤n),表示 uu 和 vv 之間存在師徒關係。

輸出格式

輸出一行 nn 個整數,第 ii 個整數表示武功排行為 ii 的人的子弟有多少人超過了他。

行末不要輸出多餘的空格。

樣例輸入

10 5

5 3

5 8

3 4

3 1

2 1

6 7

8 7

9 8

8 10

樣例輸出

0 0 2 0 4 0 1 2 0 0

dfs序列+歸併樹 (查詢區間小於val的值有幾個)

**

#include

using

namespace

std;

const

int n=100000+11;

const

int inf = 0x3f3f3f3f;

int in[n],out[n],sz=0; int val[n];

vector

ve[n];

void dfs(int u,int pre)

out[u]=sz;

}vector

t[n<<2];

void build(int rt,int le,int ri)

int mid=(le+ri)>>1;

build(rt<<1,le,mid);

build(rt<<1|1,mid+1,ri);

t[rt].resize(ri-le+1);

merge(t[rt<<1].begin(),t[rt<<1].end(),t[rt<<1|1].begin(),t[rt<<1|1].end(),t[rt].begin());

}int query(int rt,int l, int r,int le,int ri,int vv)

}int rot;

int main()

dfs(rot,-1);

build(1,1,n);

for(int i=1;i<=n;i++)

return

0;}

計蒜客 青出於藍勝於藍 dfs 樹狀陣列

題目描述 武當派一共有 n人,門派內 n 人按照武功高低進行排名,武功最高的人排名第 1,次高的人排名第 2,武功最低的人排名第 n。現在我們用武功的排名來給每個人標號,除了祖師爺,每個人都有乙個 每個人可能有多個徒弟。我們知道,武當派人才輩出,連祖師爺的武功都只能排行到 p。也就是說徒弟的武功是可...

計蒜客 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。為了降低解碼的難度,蒜頭...