動態點分治 bzoj 3730,bzoj 1095

2021-07-27 03:40:40 字數 2022 閱讀 6048

總結一下動態點分治的模板。。。

對於乙個樹,把它點分的同時記錄每個點的所有父親(logn個)並記錄點距其父親的距離。

具體實現就是dfs的時候fa[x][++dep[x]]=u,dis[x][dep[x]]=d;

bzoj1095:

您需要寫乙個程式支援反轉點的顏色,求距離最遠的黑色點對的距離。

解析:在每個點u存乙個堆st記錄該子樹(分治中的)中點到fa[u]的距離再存乙個堆son記錄他所有兒子的st.top()

最後再用乙個總的堆維護直徑。

修改的時候就從點u開始向上爬,將fa[u]的son $#%^% 一下,再修改u的st。

#include#include#include#include#include#define inf (1<<30)

#define maxn 100100

using namespace std;

struct set

void del(int x)

void pop()

int top()

int size()

int maxlen()

}st[maxn],all,son[maxn];

struct edgee[maxn<<1];

int b[20],light=0,col[maxn],head[maxn],esz,fa[maxn][18],dep[maxn],mn,rt,vis[maxn],s[maxn],dis[maxn][18],n,m,sz;

void addedge(int u,int v)

void init(int u,int f)

void getroot(int u,int f)

mxsize=max(mxsize,sz-s[u]);

if(mn>mxsize)mn=mxsize,rt=u;

}void build(int u,int f,int x,int d)

}void calc(int u,int f,int x)

void solve(int u)

void change(int i)

} else

}col[i]=!col[i];

}int main()

}

bzoj 3730

對每個點設乙個樹狀陣列bit存點到根的距離,fbit存點到跟的fa的距離,大小為樹高

於是就可以容斥了:ans+=bit(k-dis)-fbit(k-dis);

修改什麼的都暴力爬樹就可

#include#include#include#include#include#include#define inf (1<<30)

#define maxn 100100

using namespace std;

struct edgee[maxn<<1];

int rt,mn,head[maxn],key[maxn],n,m,fa[maxn][18],dep[maxn],esz,dis[maxn][18],vis[maxn],sz,s[maxn];

int *bit[maxn],*fbit[maxn],size[maxn];

void addedge(int u,int v)

void init(int u,int f)

void getroot(int u,int f)

void build(int u,int f,int x,int d)

}void solve(int u)

void modify(int* bit,int lim,int x,int a)

void change(int i)

int query(int *bit,int x)

int qsum(int x,int k)

struct _iinline int operator()()}rd;

int main(){

n=rd(),m=rd();

for(int i=1;i<=n;++i)key[i]=rd();

for(int i=1,u,v;i

BZOJ3730 震波 動態點分治

include include include include include include define space putchar define enter putchar n using namespace std typedef long long ll template void rea...

BZOJ3730 震波 動態點分治

在一片土地上有n個城市,通過n 1條無向邊互相連線,形成一棵樹的結構,相鄰兩個城市的距離為1,其中第i個城市的價值為value i 不幸的是,這片土地常常發生 並且隨著時代的發展,城市的價值也往往會發生變動。0 x k 表示發生了一次 震中城市為x,影響範圍為k,所有與x距離不超過k的城市都將受到影...

bzoj 3730 震波 動態樹分治

給出一棵樹,點有點權,每次詢問距離乙個點不超過k kk 100000 n le100000 n 1000 00把點分樹建出來,然後對每個分治中心用樹狀陣列維護到該點距離為定值的點權和,以及到他點分樹上父親距離為定值的點權和。查詢的時候每次沿著父親往上跳,在計算當前點貢獻時需要減去上乙個點所在子樹的貢...