BZOJ 3531 旅行 樹鏈剖分 動態開點

2022-04-02 17:22:36 字數 1297 閱讀 8366

題目鏈結

無優化版本(170行):

/*

首先樹剖可以維護樹上的鏈sum、max

可以對每個宗教建一棵線段樹,那這題就很好做了

不過10^5需要動態開點 (不明白為什麼nlogn不需要**就可以 不是每個insert加log個節點?)

操作修改完更改原數列!盲人。。

*/#include#include#include#define gc() getchar()

#define now node[rt]

#define lson node[rt].ls

#define rson node[rt].rs

const int n=1e5+5,maxn=n*19;

int n,q,cnt,h[n],enum,to[n<<1],nxt[n<<1],fa[n],dep[n],id[n],son[n],sz[n],top[n];

int idx,pos[n],w[n],rel[n],root[n],pool[maxn];

struct seg_tree

}node[maxn];

inline int new_node()

inline void del_node(int rt)

inline void pushup(int rt)

void insert(int l,int r,int &rt,int x) }

void delete(int rt,int x,int &son)//可以用insert將其值變為0來刪除 但是就不能重複利用了 }

void modify(int rt,int p,int v) }

int query_max(int rt,int l,int r)

void query_chain_max(int x,int y)

int main()

}node[maxn];

inline int new_node()

// inline int new_node()

// inline void del_node(int rt)

inline void pushup(int rt)

void update(int l,int r,int &rt,int p,int v) }

int query(int l,int r,int rt,int l,int r,bool opt)

int main()

} return 0;

}

BZOJ3531 旅行 樹鏈剖分

題目大意 給定一棵樹,點染色,修改點權,鏈上詢問點權和或者最大值 資料規模10 5 主要思想是對每種顏色開一顆線段樹,動態分配記憶體,染色時刪除原來的點,加入到新線段樹中即可。需要注意的是不僅插入要更新資訊,刪除也要更新資訊。自己的 include include define safe x,a x...

bzoj3531 Sdoi2014 旅行 樹剖

對每種宗教都建立線段樹,建立過程類似主席樹,在需要修改時動態建立線段樹 初始時不建立 所以空間複雜度是o nlog n ps 為什麼第二份會t啊 include include include define m 6000005 define inf 1 30 using namespace std ...

BZOJ 3531(樹鏈剖分 線段樹)

problem 旅行 bzoj 3531 題目大意 給定一顆樹,樹上的每個點有兩個權值 x,y 要求維護4種操作 操作1 更改某個點的權值x。操作2 更改某個點的權值y。操作3 求a b路徑上所有x屬性與a,b相同的點y屬性的和。操作4 求a b路徑上所有x屬性與a,b相同的點y屬性的最大值。n,q...