點分樹 樹狀陣列 BZOJ 3730 震波

2021-07-25 14:51:54 字數 1232 閱讀 4973

線段樹t成翔 只能用vector寫bit 痛苦的回憶啊

思路不難想 先建出點分樹 然後每個點對於他掌管的點的距離與權值建成bit

然後每次查詢就是爬點分樹

這裡有點注意

往樹上爬的時候不能中途break,不會因為有乙個祖先爬不上去就終止,說不定有乙個爺爺比爸爸還近

#include#include#include#includeusing namespace std;

inline char nc()

return *p1++;

}inline void read(int &x)

const int n=100005;

const int k=25;

struct edgeg[n<<1];

int head[n],inum;

inline void add(int u,int v,int p)

int n,val[n];

#define v g[p].v

int fat[n][k],dis[n][k];

int size[n],del[n];

int sum,rt,minimum;

inline void root(int u,int fa)

maximum=max(maximum,sum-size[u]);

if (minimum>maximum) minimum=maximum,rt=u;

}int maxd;

inline void depth(int u,int fa,int d,int f)

vectorc1[n],c2[n];

inline void divi(int u)

}inline void add(vector&c,int x,int r)

inline int query(const vector&c,int x)

/*int root1[n],root2[n];

int ls[n*100],rs[n*100],ssum[n*100],ncnt;

inline void add(int &x,int l,int r,int t,int v)

inline int query(int &x,int l,int r,int qr)*/

int main()

printf("%d\n",lastans=ret);

}} return 0;

}

BZOJ3730 點分樹 震波

鏈結自己找,bzoj還沒開 也很顯然是點分樹維護,對每個點開兩個樹狀陣列,維護點分樹上子樹之和,然後修改詢問仍然暴力爬樹,詢問也是用兩個樹狀陣列作差消掉當前子樹影響 code include using namespace std inline intread while isdigit ch re...

bzoj3730 震波(點分樹 bit)

傳送門 點分樹板題。然而並沒有遇到卡常之類的事。對於分出來的每一層用兩棵bit bitbi t動態維護到自己距離不超過k kk的與到自己點分樹父親距離不超過k kk的點數。include define ri register int using namespace std const int rle...

BZOJ3730 震波 動態點分治

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