題意:
思路:
上面是官方題解,套路加樹上啟發式合併,就是這個啟發式之前沒寫過,**寫的感覺有點繁瑣。
總結:當碰到關於點對的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 顯然的兩個貪心 這樣得到的...