树链剖分 学习笔记
时更。
还没开始学,放个板子先。
板子
#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
typedef long long ll;
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
using namespace std;
const int Ratio=0;
const int N=500005;
const int maxi=INT_MAX;
int n,m,tot,cnt;
int hh[N],to[N],ne[N];
int dep[N],fa[N],siz[N],son[N];
int id[N],top[N];
// int w[N],wt[N];
namespace Wisadel
{
void Wadd(int u,int v/*,int ww*/)
{
to[++cnt]=v;
// w[cnt]=ww;
ne[cnt]=hh[u];
hh[u]=cnt;
}
void Wdfs1(int u,int f,int deep)
{
dep[u]=deep,fa[u]=f,siz[u]=1;
int maxson=-1;
for(int i=hh[u];i!=-1;i=ne[N])
{
int v=to[i];
if(v==f)
continue;
Wdfs1(v,u,deep+1);
siz[u]+=siz[v];
if(siz[v]>maxson)
son[u]=v,maxson=siz[v];
}
}
void Wdfs2(int u,int topf)
{
id[u]=++tot,top[u]=topf;
// wt[tot]=w[u];
if(!son[u])
return;
Wdfs2(son[u],topf);
for(int i=hh[u];i!=-1;i=ne[i])
{
int v=to[i];
if(v==fa[u]||v==son[u])
continue;
Wdfs2(v,v);
}
}
short main()
{
memset(hh,-1,sizeof hh);
return Ratio;
}
}
int main(){return Wisadel::main();}