可以將跳左/右/父親抽象成二進位制的形式.
跳左:x<<1
跳右:x<<1|1
父親:x>>1
但是題中說如果跳到根節點之後再跳父親編號仍然不變比較不好處理.
但是我們發現乙個性質:令 $fl$ 表示乙個區間能跳到最靠上的祖先,$path$ 表示跳到該祖先後向下跳的路徑,答案一定可以表示成 max(1,x>>fl)《考慮 fl 上一次跳到根節點的時刻是 fl',則發現 fl' 到 fl 之間向上跳的多於向下跳的,所以在 fl 時刻一定是最靠上的時刻.
分析出這個後一切就簡單了,用線段樹合併這個資訊就行了.
code:
#include #include #include #define n 500008#define ll long long
#define lson now<<1
#define rson now<<1|1
#define setio(s) freopen(s".in","r",stdin)
using namespace std;
struct data
data operator+(const data b) const
void update(int l,int r,int now,int p,int v)
int mid=(l+r)>>1;
if(p<=mid) update(l,mid,lson,p,v);
else update(mid+1,r,rson,p,v);
s[now]=s[lson]+s[rson];
}
data query(int l,int r,int now,int l,int r)
else if(l<=mid)
else
}int main()
if(z==2)
}
return 0;
}
LuoguP5889 跳樹 線段樹
可以將跳左 右 父親抽象成二進位制的形式.跳左 x 1 跳右 x 1 1 父親 x 1 但是題中說如果跳到根節點之後再跳父親編號仍然不變比較不好處理.但是我們發現乙個性質 令 fl 表示乙個區間能跳到最靠上的祖先,path 表示跳到該祖先後向下跳的路徑,答案一定可以表示成 max 1,x fl 考慮...
洛谷 P5889 跳樹
大體思路很簡單,用線段樹維護區間操作,詢問便是區間查詢即可 真正有難度的地方在於操作區間合併,比較難理解。注意,中寫的運算子過載只能運用於先進行的操作 後進行的操作 操作區間合併對我這樣的蒟蒻還是挺難理解的 sys orz.include include include include includ...
2018 08 18 線段樹(線段樹)
線段樹 描述請你維護乙個線段樹 支援一下操作 a x l r 區間 and x o x l r區間 or x x x l r 區間 xor x s l r 區間求和 輸入乙個數 t表示資料組數 乙個數n表示初始序列長 m表示查詢 隨後n個整數 接下來m次詢問 如上 輸出所以s次詢問的答案 樣例輸入 ...