suoi63 樹與路徑 倍增lca

2022-04-30 00:45:14 字數 1574 閱讀 4405

發現對於某乙個點它向上發的一條邊,它被經過的次數就是這個點子樹數量*不是它子樹的數量

那就維護乙個字首和,然後每次拿兩個端點和它們的lca的值加一加減一減,再乘上加上的值,就是這次修改後答案的增量

(最後答案還要除以(n*n))

倍增會被卡空間,難受

1 #include2

#define pa pair3

#define lowb(x) ((x)&(-(x)))

4#define rep(i,n0,n) for(i=n0;i<=n;i++)

5#define per(i,n0,n) for(i=n;i>=n0;i--)

6#define max(a,b) ((a>b)?a:b)

7#define min(a,b) ((a8

#define clr(a,x) memset(a,x,sizeof(a))

9#define rei register int

10using

namespace

std;

11 typedef long

long

ll;12

const

int maxn=1000010,mod=998244353;13

14inline ll rd()

17while(c>='

0'&&c<='

9') x=x*10+c-'

0',c=getchar();

18return x*neg;19}

2021

struct

edgeeg[maxn*2

];24

intn,m,egh[maxn],ect,lg[maxn],np;

25int fa[maxn][2

],dep[maxn],siz[maxn],sum[maxn],num[maxn],ans;

2627 inline void adeg(int a,int b,int

l)30

31void dfs(int x,int

f)num[x]=1ll*siz[x]*(n-siz[x])%mod;38}

39void dfs2(int x,int

f)45}46

47 inline int modp(int x,int

p)return

re;53}54

55 inline int lca(int x,int

y)if(x==y) return

x;60

for(int i=lg[dep[x]];i>=0;i--)return fa[x][0

];63}64

65int

main()

72 rep(i,1,n-1

)dfs(1,0);dfs2(1,0

);76

int ans=0;77

for(i=1;i<=ect;i++)printf("

%d\n

",(int)(1ll*ans*np%mod));

81 rep(i,1

,m)87

return0;

88 }

樹鏈剖分與倍增求LCA

首先我要吐槽機房的辣基供電情況,我之前寫了一上午,馬上就要完成的時候突然停電,然後 gg 成了送鏈剖分 其次,我沒歧視 tarjan lca 理解較為簡單的一種方法,但速度略慢 每個數字都可以拆成幾個二的整數次的和,我們可以找出每個數字是由哪幾個二的整數次的數合成的 比如說 14 1110 2 10...

最短路徑與最小生成樹

19.8.9 總結 上午深入理解floyd演算法 就是將每一點都遍歷過去 然後選最短的 先理解最短路徑的一種演算法 有點難搞 下午測試 基礎不太行 以前寫的也有些忘了 晚上學最小生成樹 一開始難以理解 但看了各種部落格後漸漸理解 最後思路逐漸清晰 prim演算法就是 先將起點加入生成樹 然後從起點開...

linux目錄樹和絕對路徑與相對路徑

目錄樹 directory tree 在linux底下,所有的檔案與目錄都是由根目錄開始的。那是所有目錄與檔案的源頭,然後,再乙個乙個分下來。因此我們稱這種目錄配置方式為目錄樹 directory tree 這個目錄的主要特徵是 目錄樹的起始點為根目錄 每個目錄不僅可以使用本地端的partition...