#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...