思路:
先隨便選個點 鏈剖+線段樹
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的裸題?那你寫去啊 很顯然,如果沒有第乙個操作就是樹剖的裸題 其實有了第乙個操作也是樹剖的裸題 我們考慮換根之後會對那些節點產生影響 以下來自 第一種情況 ...