牛客挑戰賽42 B 小睿睿的傷害 樹上啟發式合併

2021-10-23 18:48:43 字數 1860 閱讀 1830

題意:

思路:

上面是官方題解,套路加樹上啟發式合併,就是這個啟發式之前沒寫過,**寫的感覺有點繁瑣。

總結:當碰到關於點對的lca具有某些性質時,可以考慮對於每個點,當這個點成為lca時求把這個點當作lca的點對對其的貢獻。

#include

#include

#include

using

namespace std;

const

int max_n=

101000

;vector<

int>v[max_n]

,p[max_n]

;int val[max_n]

,ans1[max_n]

;long

long ans2[max_n]

;int size[max_n]

,wson[max_n]

;long

long cnt[max_n]

;bool vis[max_n]

;int maxx;

long

long maxl;

void

dfs1

(int x,

int fa)

}void

cal_ask

(int x,

int fa)

else

if(y>maxx)}}

for(

int i=

0;i.size()

;i++)}

void

cal(

int x,

int fa,

int vl)

for(

int i=

0;i.size()

;i++)}

void

cal(

int x,

int vl)

else

if(y>maxx)}}

}for

(int i=

0;isize()

;i++)}

void

dfs2

(int x,

int fa,

int flag)

if(wson[x]

)//cal(x,fa,1);

for(

int i=

0;i.size()

;i++

)cal

(x,1);

ans1[x]

=maxx;ans2[x]

=maxl;

maxx=maxl=0;

if(wson[x]

) vis[wson[x]]=

false;if

(!flag)

}void

init()

}int

main

(void

)for

(i=1

;i<=n;i++

)scanf

("%d"

,&val[i]);

dfs1(1

,0);

dfs2(1

,0,0

);for(i=

1;i<=n;i++

)printf

("%d %lld\n"

,ans1[i]

,ans2[i]);

return0;

}

牛客挑戰賽46 B最小的指數

傳送門題意 1e6次詢問,每次給你乙個1e18的數問你質因數分解後的所有質因數中的指數冪中最小的是多少。題解 將4000以下的素數預處理,然後分解n,若剩餘值等於1說明已完全分解,若大於1,也易知其剩餘最小質因數指數冪不超過4,便如下分類討論。1.若為4,則必為x 4 n 2.若為3,則必為x 3 ...

牛客挑戰賽46 B 最小的指數

給出乙個數 x 將它分解質因數成 prod p i a i 0 求 min a i t le 10 5 x le 10 pollard rho顯然過不去。先將 4000 以內的質數都暴力做一遍,如果遇到了 x 的因數計算一下。對於剩餘的質數,ans 不會大於等於 5 因為 4000 5 10 那麼 ...

牛客挑戰賽33 B 鴿天的放鴿序列

也許更好的閱讀體驗 mathcal 定義乙個長為 n 的 01 序列 a 1,a 2,dots,a n 的權值為 sum n sum i a j bmod 2 求有多少個長為 n 的 01 序列滿足有恰好 k 個 1 且權值最大。答案對 10 9 7 取模。mathcal 顯然的兩個貪心 這樣得到的...