題意:
操作一:將根節點變為x
操作二:將x到y的點權變為v
操作三:詢問x及其子樹中最小點權
按照1進行樹剖即可
如果 x為根節點 那麼輸出線段樹最小值即可
如果x不在1-root的路徑上 那麼正常輸出x的子樹即可(為+siz)
如果x在1-root的路徑上 設x在1-root上的兒子節點為y 輸出除了 id[y],id[y]+siz[y]-1 的其他部分的最小值即可 也就是 1----d[y]-1 id[y]+siz[y]-----n
#includeusingview codenamespace
std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define see(x) (cerr<
#define clr(a,v) memset(a,v,sizeof a)
////////////////////////////////////
/const
int n=1e6+100
;ll minn[n
<<2],col[n<<2
];int
n,m,root,t;
ll w[n],node[n];
void build(int l,int r,int
pos)
int m=(l+r)>>1
; build(l,m,pos
<<1);build(m+1,r,pos<<1|1
); minn[pos]=min(minn[pos<<1],minn[pos<<1|1
]);}
void down(int
pos)
void upsum(int l,int r,ll v,int l,int r,int
pos)
down(pos);
int m=(l+r)>>1
;
if(l<=m)upsum(l,r,v,l,m,pos<<1
);
if(r>m)upsum(l,r,v,m+1,r,pos<<1|1
); minn[pos]=min(minn[pos<<1],minn[pos<<1|1
]);}
ll qmin(
int l,int r,int l,int r,int
pos)
int fa[n][30
],id[n],ncnt,dep[n],son[n],siz[n],top[n],head[n],pos;
struct edgeedge[n<<1
];void add(int a,int b);head[a]=pos;}
void dfs1(int x,intf)}
void dfs2(int x,int
topf)
}void upsum(int x,int y,int
v)
if(dep[x]>dep[y])swap(x,y);
upsum(id[x],id[y],v,
1,n,1);}
int get1(int x,int
k)int
main()
rep(i,
1,n)scanf("
%lld
",&node[i]);
scanf("%d
",&root);
dfs1(
1,1);
dfs2(
1,1);
build(
1,n,1);int
a,b,c,y;ll d;
while(m--)
if(dep[x]1)][0]==x)
else printf("
%lld\n
",qmin(id[x],id[x]+siz[x]-1,1,n,1
)); }
}return0;
}
洛谷P3979 遙遠的國度 樹鏈剖分
時空限制 1000ms 128mb 題目描述 zcwwzdjn在追殺十分sb的zhx,而zhx逃入了乙個遙遠的國度。當zcwwzdjn準備進入遙遠的國度繼續追殺時,守護神rapid阻攔了zcwwzdjn的去路,他需要zcwwzdjn完成任務後才能進入遙遠的國度繼續追殺。問題是這樣的 遙遠的國度有n個...
題解 P3979 遙遠的國度
text quad 可以看看我的一篇blog關於樹鏈剖分 換根操作 筆記 內容都差不多 quad 另外洛谷上還有一道關於換根操作的題目 cf916e jamie and tree 我的題解 text 換根,直接換即可 路徑修改,就和普通樹剖一樣。子樹修改,這個需要分類討論。下面會細講 quad 因為...
洛谷 P3979 遙遠的國度
洛谷傳送門 zcwwzdjn在追殺zhx,而zhx逃入了乙個遙遠的國度。當zcwwzdjn準備進入遙遠的國度繼續追殺時,守護神rapid阻攔了zcwwzdjn的去路,他需要zcwwzdjn完成任務後才能進入遙遠的國度繼續追殺。問題是這樣的 遙遠的國度有 nn 個城市,這些城市之間由一些路連線且這些城...