發現對於某乙個點它向上發的一條邊,它被經過的次數就是這個點子樹數量*不是它子樹的數量
那就維護乙個字首和,然後每次拿兩個端點和它們的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...