POJ3237 Tree 樹鏈剖分 邊權

2021-09-25 08:43:46 字數 2322 閱讀 5040

傳送門:

n個點的,n-1條邊

修改單邊邊權

將a->b的邊權取反

查詢a->b邊權最大值

修改邊權就查詢點的深度大的點,用大的點去存這條邊的邊權,其餘的就和點權的是一樣的了

取反操作用線段樹維護,區間最大值取反就是區間最小值,區間最小值取反就是區間最大值

所以維護兩顆線段樹即可,lazy標記表示覆蓋單邊的邊權

#include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpii;

typedef unsigned long long ull;

#define ls rt<<1

#define rs rt<<1|1

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define bug printf("*********\n")

#define fin freopen("input.txt","r",stdin);

#define fon freopen("output.txt","w+",stdout);

#define io ios::sync_with_stdio(false),cin.tie(0)

#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"

#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"

#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<> 1;

build(lson);

build(rson);

push_up(rt);

}void push_down(int rt)

}void update_pos(int pos, int val, int l, int r, int rt)

push_down(rt);

int mid = (l + r) >> 1;

if(pos <= mid) update_pos(pos, val, lson);

else update_pos(pos, val, rson);

push_up(rt);

}void update(int l, int r, int l, int r, int rt)

push_down(rt);

int mid = (l + r) >> 1;

if(l <= mid) update(l, r, lson);

if(r > mid) update(l, r, rson);

push_up(rt);

}int query(int l, int r, int l, int r, int rt)

push_down(rt);

int mid = (l + r) >> 1;

int ans = -inf;

if(l <= mid) ans = max(ans, query(l, r, lson));

if(r > mid) ans = max(ans, query(l, r, rson));

return ans;

}void change(int u, int v)

update(id[top[u]], id[u], 1, cnt, 1);

u = fa[top[u]];

}if(u != v)

}void query(int u, int v)

ans = max(ans, query(id[top[u]], id[u], 1, cnt, 1));

u = fa[top[u]];

}if(u != v)

printf("%d\n", ans);

}int u[maxn], v[maxn], c[maxn];

int main()

prebuild();

build(1, cnt, 1);

char op[20];

int a, b;

while(1) else if(op[0] == 'n') change(a, b);

else if(op[0] == 'q') query(a, b);}}

return 0;

}

poj3237 Tree 樹鏈剖分

這個題是spoj的改版 是在原來的題意上增加了區間取反操作 所以只需要在spoj375的基礎上再線段樹上增加乙個取反標誌 同時在維護乙個區間最小值 因為在區間取反了以後 區間的最大值就是區間原來的最小值 嗯 就這樣就可以了 include include include using namespac...

POJ3237 Tree 樹鏈剖分

題意 給定一棵樹,有3種操作,1.修改某條邊,2.給兩個點間路徑上的邊取相反數,3.求兩個點間路徑上的邊權的最大值 思路 樹鏈剖分,求區間最大值,又能取反,那麼線段樹維護乙個最大值和最小值,取反的時候,一段區間的最大值取反 賦給 最小值,最小值取反 賦給 最大值。同時,需要乙個laze標記。incl...

POJ 3237 Tree 樹鏈剖分

題意 給出一棵樹,每條邊有乙個權值。下面有3種操作 分析 因為是線段樹成段取反操作,可以先打個neg標記,表示這段區間的數是否取反。再維護區間最大值和最小值,取反之後,新區間的最大值是原來最小值的相反數,新區間最小值是原來最大值的相反數。include include include using n...