BZOJ 3083 樹鏈剖分 倍增 線段樹

2022-04-30 06:06:09 字數 2267 閱讀 6229

思路:

先隨便選個點 鏈剖+線段樹

1操作 就直接改root變數的值

2操作 線段樹上改

3操作

分成三種情況

1.new root = xx 整個子樹的min就是ans

2. lca(new root,xx) !=xx query 一下 當前的標號 和當前的標號+size(鏈剖不就是個特殊的dfs序嘛)

3. lca(new root,xx) =xx 找一下root在xx的哪個子樹裡 這個子樹的補集就是解了

好多題解寫得是有問題的

他們找root在xx的哪個子樹裡 這個操作是暴力找的 會被菊花圖卡

(所以我就又寫了個倍增)

後附 對拍程式 (這玩意兒一遍ac真是幻想 啊……)

//by siriusren33333333333333

#include

#include

#include

using namespace std;

#define n 222222

int n,m,op,xx,yy,zz,v[n],next[n],first[n],tot,wei[n],tree[n*8],lazy[n*8];

int size[n],son[n],fa[n],deep[n],top[n],change[n],cnt,root,f[n][20],rev[n];

void add(int

x,int

y)void dfs(intx)}

void dfs2(int

x,int tp)

void push_down(int

pos)

void build(int l,int r,int

pos)

int mid=(l+r)>>1,lson=pos

<<1,rson=pos

<<1|1;

build(l,mid,lson),build(mid+1,r,rson);

tree[pos]=min(tree[lson],tree[rson]);

}void insert(int l,int r,int

pos,int l,int r,int val)

if(~lazy[pos])push_down(pos);

int mid=(l+r)>>1,lson=pos

<<1,rson=pos

<<1|1;

if(mid1,r,rson,l,r,val);

else

if(mid>=r)insert(l,mid,lson,l,r,val);

else insert(l,mid,lson,l,r,val),insert(mid+1,r,rson,l,r,val);

tree[pos]=min(tree[lson],tree[rson]);

}int query(int l,int r,int

pos,int l,int r)

void change(int

x,int

y,int val)if(deep[x]>deep[y])swap(x,y);

insert(1,n,1,change[x],change[y],val);

}int lca(int

x,int

y)return deep[x]>deep[y]?y:x;

}int main()

int lca=lca(xx,root);

if(xx!=lca)printf("%d\n",query(1,n,1,change[xx],change[xx]+size[xx]-1));

else}}

}

maker

//by siriusren

#include

#include

#include

#include

using namespace std;

int n=100000,m=100000,seed;

int main()

}

對拍:

//by siriusren

#include

#include

#include

#include

using

namespace

std;

int cases;

int main()}}

BZOJ 3083 遙遠的國度 樹鏈剖分

題目大意 給出一顆無根樹,有鏈的修改操作,還有子樹的查詢。除此之外,還有選定這棵樹的乙個點為根。思路 子樹操作,鏈上修改,帶size域的樹鏈剖分就可以搞定。換根肯定不能真的換,出題人要是閒的沒事所有操作都在換根就慘。我們可以畫一張圖模擬下換根。先按照讀入的順序建一顆有根樹,然後觀察當前的根在要詢問的...

BZOJ 3083 遙遠的國度 樹鏈剖分

題目大意 給定一棵有根樹,有以下操作 換根,鏈上修改,子樹查詢最小值。樹鏈剖分配合線段樹可以輕鬆解決子樹查詢與鏈上修改,換根怎麼辦?當然不能真的換根。設初始根為 root 也就是說樹剖處理時是以 root 為根的 當前根為 cur 對於每一次查詢子樹x進行討論 1.如果 x 就是 cur 取所有點最...

BZOJ3083 遙遠的國度 樹鏈剖分

n 個節點的樹,每個點有權值,支援三種操作 1 換根 2 把 x 到 y 路徑上節點權值變為 z 3 詢問路徑最小值 啥?你說這是toptree的裸題?那你寫去啊 很顯然,如果沒有第乙個操作就是樹剖的裸題 其實有了第乙個操作也是樹剖的裸題 我們考慮換根之後會對那些節點產生影響 以下來自 第一種情況 ...