題意:對樹上兩點區間增加或減少每點的權值,單點查詢每點的權值。
思路:一開始線段樹寫的,但是我的被卡了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寫是由於曾經被坑過,不但沒有這...