樹鏈剖分 線段樹 POJ3237 權值在邊 模板

2021-08-09 07:43:39 字數 1032 閱讀 9032

#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn=100010;

struct edgeedge[maxn*2];

int head[maxn],tot;

int top[maxn];//top[v]表示v所在的重鏈的頂端節點

int fa[maxn];//父親節點

int deep[maxn];//深度

int num[maxn];//num[v]表示以v為根的子樹的節點數

int fp[maxn];//和p陣列相反

int son[maxn];//重兒子

int pos;

int e[maxn][3];

void init()

void add(int u,int v)

void dfs1(int u,int father,int dep)//第一遍dfs求出fa,deep,num,son

pushup(i);

}int findmax(int u,int v)//查詢u->v邊的最大值

void negate1(int i,int l,int r)// 更新線段樹的區間[l,r]取反

pushdown(i);

int mid=(q[i].l+q[i].r)/2;

if(r<=mid)

negate1(i*2,l,r);

else if(l>mid)

negate1(i*2+1,l,r);

else

pushup(i);

}void negate(int u,int v)//把u-v路徑上的邊的值都設定為val

int main(void)

char op[10];

int x,y;

while(scanf("%s",op)!=eof)

}return 0;

}

poj 3237 樹鏈剖分 線段樹

題意 給一棵樹,三種操作。將第i條邊的權值改為v,將a到b的路徑上的邊的權值全部取反,求a到b路徑上邊的權值的最大值。思路 明顯的樹鏈剖分,加上線段樹的操作。因為有取反的操作所以每個區間要記錄最大值和最小值。查詢兩點間的路徑時,用求公共祖先的方式去求。include include includec...

poj 3237 樹鏈剖分 線段樹

題意就是給你一棵樹,每條邊上都有權值,有三種操作,把某條邊的權值變成v,把點a到點b之間的路徑上的邊的權值都乘上 1,求a到b的路徑上的最大值。其實這題的線段樹要比樹鏈剖分難寫,首先,因為有乘 1的操作,所以不光要維護最大值,還要維護最小值,這樣在乘 1後,最大值就可以直接根據最小值得到,當然,延遲...

poj 3237 樹鏈剖分

對樹有三種操作 q a b 詢問a b路徑的最大值 n a b 對a b路徑上的數進行取反操作 a a c a b 將第a條邊的值改為b 對於取反操作,記錄區間的最大和最小值和標記k,更新線段即可。pragma comment linker,stack 1024000000,1024000000 i...