hdu3966 樹刨 bit區間修改單點查詢

2021-09-26 09:10:48 字數 1370 閱讀 3791

題意:對樹上兩點區間增加或減少每點的權值,單點查詢每點的權值。

思路:一開始線段樹寫的,但是我的被卡了2*maxn的空間,優化一下就可以了,但是嫌太麻煩,出題人可能就打算卡部分人的線段樹。

用bit的話,類似預處理陣列,每次查詢0-x點的區間和就可以,修改左端點和右端點的權值為v和-v即可。

**:

#include

using

namespace std;

#define ll long long

#define forn(i,n) for(int i=0;i#define for1(i,n) for(int i=1;i<=n;i++)

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

const

int maxn =

5e4+5;

int n,m,id,q,top[maxn]

,a[maxn]

,p[maxn]

,par[maxn]

,son[maxn]

,sz[maxn]

,deep[maxn]

;vector<

int>e[maxn]

;struct bit

void

init()

void

update

(int pos,

int v)

intask

(int pos)

}bit;

void

init()

bit.

init()

; id =0;

}void

dfs(

int u,

int pre,

int d)

}void

getpos

(int u,

int gg)

}void

change

(int x,

int y,

int v)

if(deep[x]

>deep[y]

)swap

(x,y)

;//cerrupdate

(p[x]

,v);

bit.

update

(p[y]+1

,-v);}

intmain()

dfs(1,

0,0)

;getpos(1

,1);

for1

(i,n)

while

(q--

)else}}

return0;

}

hdu3966 樹刨 bit區間修改單點查詢

題意 對樹上兩點區間增加或減少每點的權值,單點查詢每點的權值。思路 一開始線段樹寫的,但是我的被卡了2 maxn的空間,優化一下就可以了,但是嫌太麻煩,出題人可能就打算卡部分人的線段樹。用bit的話,類似預處理陣列,每次查詢0 x點的區間和就可以,修改左端點和右端點的權值為v和 v即可。includ...

HDU3966 樹鏈剖分

題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...

hdu3966 樹鏈剖分

近期在強化知識點深度。發現樹鏈剖分不是非常會寫了。回想一下改動操作 若兩個點在同一條鏈上,則直接改動這段區間。若不在同一條鏈上,改動深度較大的點到其鏈頂端的區間,同一時候將這個點變為他所在鏈頂端的父親,迴圈操作直到這兩個點在同一條鏈上。就能夠用上一種方法了。沒實用lca寫是由於曾經被坑過,不但沒有這...