總結一下動態點分治的模板。。。
對於乙個樹,把它點分的同時記錄每個點的所有父親(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把點分樹建出來,然後對每個分治中心用樹狀陣列維護到該點距離為定值的點權和,以及到他點分樹上父親距離為定值的點權和。查詢的時候每次沿著父親往上跳,在計算當前點貢獻時需要減去上乙個點所在子樹的貢...